我写了以下代码:
int i = 0;
switch(i++)
{
case 0:
cout << 0;
case 1:
cout << 1;
}
cout << "\n" << i;
代码的输出是这样的:
01
1
任何人都可以解释第一行输出吗?为什么0和1都被打印?
答案 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.这是明确定义的行为,此处序列点没有问题。