【问题标题】:switch statement and incrementation operatorswitch 语句和增量运算符
【发布时间】:2011-07-10 23:40:53
【问题描述】:

我写了以下代码:

int i = 0;  
switch(i++)  
{
   case 0:  
     cout << 0;  
   case 1:  
     cout << 1;
}  
cout << "\n" << i;  

代码的输出是这样的:

01  
1

谁能解释一下输出的第一行?为什么 0 和 1 都被打印出来了?

【问题讨论】:

标签: c++ switch-statement post-increment


【解决方案1】:

首先,表达式 i++后自增运算符)的计算结果为 0(即使它将 i 的值设置为 1)。所以在switch 内部,case 0: 分支被选中。

然后,因为你的case 0: 后面没有break,程序继续执行case 1: 标签中的代码。

总结起来,你有:0 来自第一个 switch 分支,1 来自第二个分支,还有一个 1,因为这是 i 的最终值。

【讨论】:

    【解决方案2】:

    因为你需要在每个 case 之后添加一个break,这样会阻止执行以下语句。例如

    switch(i++)  
    {
       case 0:  
         cout<<0;  
         break;
       case 1:  
         cout<<1;
         break;
    }  
    

    诚然,第二次休息是多余的,但我把它放在那里只是为了保持一致性

    【讨论】:

    • 您通常不会缩进break 以与case 分支中的语句块对齐吗?我觉得这很奇怪。
    • 是的,但是在 SO 上格式化代码可能有点乏味。固定。
    【解决方案3】:

    你需要输入“break;”在每个案例的末尾。

    【讨论】:

      【解决方案4】:

      switch 是一个奇怪的结构。它来源于C,Java和C#也采用了它,所以不能认为它是完全“非OO”的。

      switch on state which changes是一个有效的OO概念,但通常用于基于类型的切换。

      特别是编译器通常会创建一个“跳转”表,这意味着它是 O(1) 的代码块被调用,这与嵌套的“if”语句不同。您可能有多个值(不包括默认值)跳转到同一点,因此代码块会“相互碰撞”,除非您明确插入“break”语句。

      这就是它在 C 中的完成方式,并且一直保留在 C++ 中。

      关于开关中的值,它必须是一个数值,但不一定是一个常数。在您的情况下,i++ 的计算结果为 0,但将 i 递增到 1。这是定义明确的行为,此处的序列点没有问题。

      【讨论】:

      • 它是一个后增量运算符,对。所以,它会在它作为一部分的表达式中完成它的工作后增加......所以它就像在打印 0 之后一样,它增加自己然后转到案例 1
      猜你喜欢
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 2017-10-02
      相关资源
      最近更新 更多