2

我不确定我是否理解 if 块和 switch/select 块之间的区别。我的意思是我一直在使用它们。但是我不清楚什么时候应该应用 switch 块,什么时候不应该。因为,选择块可以扩展为 if 块。因此,我能想到的使用 select 块的唯一真正优势是人类可读性。

4

5 回答 5

4

答案会因语言而异。例如,在 C 和 C++ 中,switch(select) 语句可以被编译器转换为相当有效的跳转表,部分原因是它们比if语句条件更具限制性。(尽管公平地说,现代编译器非常擅长优化各种东西。)这可能不适用于所有语言/编译器(我似乎记得 VB6 基本上被Select Case视为一系列If/ElseIf语句。)

可读性绝对是一个因素:使用 a switch(或Select Case在 VB 中)告诉任何跟随你的人,下面的所有分支都在一个共同条件下分支,这非常有用。

可维护性(与可读性相关但不同)也是一个因素。如果您更改 a 中分支的一件事switch,您就完成了;如果你有一连串的if陈述,很容易漏掉一个(或多个)。

于 2010-07-02T07:09:35.200 回答
2

一个 switch 块几乎需要以下内容:

  • 您只有一个标准要调查,或者有几个相互不依赖的标准
  • 您有多个(即超过 2 或 3 个)预定义分支
  • 您想搜索平等,例如“day == Days.Monday”

如果您想同时检查多个相互依赖的标准,如果您只有一个分支(或者可能是两个小分支),或者如果您想搜索不等式(例如“时间 > 8.00”),则 if 语句是要走的路。

可以说,我列表中的第一点可以使用各种“漂亮”技术来规避,但根据我的经验,这仅相当于复杂且难以阅读的代码 - 正如 TJ 所说,可读性是编写可维护代码时的一个因素。

于 2010-07-02T07:26:05.020 回答
2

所以我能想到的使用 select 块的唯一真正优势是人类可读性..

不要小看这一点。在编程中,人类可读性应该是默认的第一要务

于 2010-07-02T07:36:29.817 回答
0

取决于我想的语言,但假设你在谈论 C。在 C 中,switch-block 将转换为跳转表,因此你将根据值直接跳转到你想要执行的部分,而 if 块可以进行任意比较,并且必须将其与每个可能的值进行比较以找到要执行的分支。

请注意,开关只能使用设置值(跳转表是在编译时创建的),而 if 块可以进行小于/大于比较或与变量的比较。

于 2010-07-02T07:09:44.327 回答
0

如果要比较多个项目,则需要使用 if 块。您可以使用 if/elseif/else。如果您想对一个变量的值做出反应,您将使用 switch/select 块。

if (today is monday) {
     it is moday.
} else if (today is tuesday and it is 8:00pm) {
     it was not monday but it is tuesday and it is 8:00pm.
} else {
     it must be sunday.
}

switch (day) {
     case: Monday
          it is monday

     case: Tuesday
          it is tuesday
}
于 2010-07-02T07:12:36.287 回答