switch语句和增量运算符

时间:2011-03-08 09:44:14

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

我写了以下代码:

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

代码的输出是这样的:

01  
1

任何人都可以解释第一行输出吗?为什么0和1都被打印?

4 个答案:

答案 0 :(得分:18)

首先,表达式i++后增量运算符)的计算结果为0(即使它将i的值设置为1)。因此,在switch内,选择了case 0:分支。

然后,由于break之后没有case 0:,程序会继续执行case 1:标签中的代码。

总结一下,你得到:第一个switch分支为0,第二个分支为1,另一个为1,因为这是i的最终值。

答案 1 :(得分:7)

因为您需要在每个案例之后添加break,这会阻止执行以下语句。 E.g。

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

不可否认,第二次休息是多余的,但我只是为了保持一致而把它放在那里

答案 2 :(得分:2)

你需要把“休息”;在每个案件的最后。

答案 3 :(得分:0)

开关是一个奇怪的结构。它来自C,Java和C#也采用它,所以它不被认为是完全“非OO”。

开启状态,其中更改是有效的OO概念,但通常用于基于类型进行切换。

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

这是在C中完成的,并且已经为C ++保留。

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