Language agnostic 编程101,选择VS if块

Language agnostic 编程101,选择VS if块,language-agnostic,control-flow,Language Agnostic,Control Flow,我不确定我是否理解if块和switch/select块之间的区别。 我是说我一直在用它们。但我不清楚何时应用开关块,何时不应用。因为,select块可以扩展为if块。 因此,我所能想到的使用select块的唯一真正优势是可读性。答案会因语言而异。例如,在C和C++中, Twitter (select)语句可以由编译器变成相当有效的跳转表,部分原因是它们比 > 语句条件更具限制性。(虽然公平地说,现代编译器非常擅长优化各种东西。)这可能不是所有语言/编译器都是如此(我似乎记得VB6基本上被视为Se

我不确定我是否理解if块和switch/select块之间的区别。 我是说我一直在用它们。但我不清楚何时应用开关块,何时不应用。因为,select块可以扩展为if块。
因此,我所能想到的使用select块的唯一真正优势是可读性。

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

可读性绝对是一个因素:使用
开关
(或VB中的
选择大小写
)告诉任何跟随您的人,下面的所有分支都在一个公共条件下分支,这非常有用


可维护性(与可读性相关,但不同于可读性)也是一个因素。如果在
开关
中更改正在分支的一个对象,则完成操作;如果你有一长串的
if
语句,很容易漏掉一个(或多个)语句。

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


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

如果要比较多个项,则需要使用if块。您可以使用if/elseif/else。如果要对一个变量的值作出反应,可以使用开关/选择块

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
}

开关块几乎需要以下各项:

  • 您只有一个标准需要研究,或者有几个标准彼此不依赖
  • 您有多个(即超过2或3个)预定义的分支
  • 您希望搜索相等,例如“day==Days.Monday”
如果您想要同时检查多个相互依赖的标准,如果您只有一个分支(或者可能有两个小分支),或者如果您想要搜索不平等性(例如“time>8.00”),那么If语句就是最好的选择

可以说,我的列表中的第一点可以使用各种“漂亮”的技术来规避,但根据我的经验,这只会导致代码复杂且难以阅读——正如T.J.所说,在编写可维护代码时,可读性是一个因素

因此,我能想到的使用select块的唯一真正优势是可读性


不要低估这一点在编程中,人类可读性应该是默认的首要关注点

9秒。。。我一定是个打字慢的什么的……)