在C ++中,为什么它们会让你在switch语句中放置break语句?

时间:2010-08-23 01:02:27

标签: c++ switch-statement

我知道它的基本概念是什么,但我在思考,并且我意识到,因此对于switch语句而言,它需要比一堆if语句更多的字符。

由于if语句有7个字符(不包括变量名,也不包括它的比较,也没有代码),而switch语句有9个字符(同样的东西),因为这个词“break”,即使没有它,“case:”这个单词也是5个字符,而if语句则是7个字符,所以它并不比if语句好多了!

9 个答案:

答案 0 :(得分:16)

这样你就可以做像

这样的事情
switch (toupper(ch))
   {
   case 'A':
   case 'E':
   case 'I':
   case 'O':
   case 'U':
      bVowel = true;
      break;

   default:
      bVowel = false;
      break;
   }

答案 1 :(得分:3)

我认为这是一种错误,因为进入下一个区块的能力令人困惑且容易出错。想要匹配多个选项的常见情况可以写得更好:

switch (expression) {
   case 1, 7, 9:
      do something;
   case 2, 8, 10:
      do something else;
}

这不是C ++的一个选项,因为该语言被设计为与C相对向后兼容。

答案 2 :(得分:3)

除字符数外还有许多重要因素:

  • switch语句评估表达式一次,而if语句的延迟编码可能要求重复评估...如果昂贵或有副作用则不合需要
  • 案件是否应该通过或需要休息时间因用途而异:如果同样的行为适用于许多案件,您可以节省很多字符
  • 优化器应该使switch语句至少与if / else if / else链一样有效,并且对于许多用法,它可以更有效(例如,数组中的查找值可以切换到所需的行为/结果,建立二元搜索)
  • switch语句更好地记录决定流的单个值,而if / else-if / else需要程序员分别检查每个表达式

答案 3 :(得分:1)

你有一个非常奇怪的方法来决定哪个是“更好”。一般来说,“更容易思考”是比“更短”更有用的测试。

最终,这就是C语言的设计者决定了提供可读性和易编译性的最佳组合的方式。

对于任何体面的优化编译器,最终生成的程序可能不会有太大差异。

答案 4 :(得分:1)

编译器可以提出各种不同的策略来生成switch语句的机器代码,即:

  • 查找表,当测试的值非常接近时
  • 二元搜索,当有很多值时
  • 看起来就像if-then的代码。

现在,编译器可能足够聪明,可以对一堆if语句进行此类优化,但在设计语言时肯定不是这种情况,并且switch语句放置所有信息都在那里供编译人员查看并决定生成什么代码。

答案 5 :(得分:0)

  1. 必须在运行时评估每个“if”语句。这可能取决于编译器优化。

  2. 根据我的理解,在评估每个案例的表达方面,切换语句更有效。

  3. 如果您不添加中断,则switch语句将继续关闭并可能执行更多案例。例如,默认语句。例如if / else

  4. 我更喜欢if / else if / else,因为如果忘记休息,他们就更难被捣乱。它们占用的空间较少,而且与其他程序员相比更常见。但是你可以让switch语句看起来很漂亮。

答案 6 :(得分:0)

对于switch语句,编译器可以例如制作案例值和goto地址的映射并进行优化查找,而不是仅仅通过所有“if”检查。

答案 7 :(得分:0)

Duff's Device之类的东西可以起作用。

答案 8 :(得分:0)

C的设计易于编译。该语言的许多方面都非常糟糕,例如旧样式参数传递,已成功弃用。案例陈述的设计使得案例标签不必生成任何代码,但可以与“goto”标签类似地处理。如今,语言并不特别需要易于编译,但是如果不破坏批次代码就不可能改变'switch'语句的工作方式。