3

我写了以下代码:

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

代码的输出是这样的:

01  
1

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

4

4 回答 4

18

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

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

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

于 2011-03-08T09:46:34.963 回答
7

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

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

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

于 2011-03-08T09:46:43.540 回答
2

你需要把“break;” 在每个案例结束时。

于 2011-03-08T09:47:32.530 回答
0

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

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

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

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

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

于 2011-03-08T10:41:58.860 回答