编程101,选择VS if block

时间:2010-07-02 07:05:13

标签: language-agnostic control-flow

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

5 个答案:

答案 0 :(得分:4)

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

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

可维护性(与可读性相关但不同)也是一个因素。如果你在switch中改变了一个被分支的东西,你就完成了;如果您有一长串if语句,很容易错过一个(或更多)语句。

答案 1 :(得分:2)

交换机块非常需要以下内容:

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

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

可以说,我的列表中的第一点可以使用各种“漂亮”技术来规避,但根据我的经验,这只是令人费解和难以阅读的代码 - 以及T.J.陈述,可读性是编写可维护代码的一个因素。

答案 2 :(得分:2)

  

因此,我可以想到使用选择块的唯一真正优势是人类可读性。

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

答案 3 :(得分:0)

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

请注意,交换机只能使用设置值(跳转表在编译时创建),而if块可以执行小于/大于比较或比较变量。

答案 4 :(得分:0)

如果要比较多个项目,可能需要使用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
}