我写了以下代码:
int i = 0;
switch(i++)
{
case 0:
cout << 0;
case 1:
cout << 1;
}
cout << "\n" << i;
代码的输出是这样的:
01
1
谁能解释一下输出的第一行?为什么 0 和 1 都被打印?
我写了以下代码:
int i = 0;
switch(i++)
{
case 0:
cout << 0;
case 1:
cout << 1;
}
cout << "\n" << i;
代码的输出是这样的:
01
1
谁能解释一下输出的第一行?为什么 0 和 1 都被打印?
首先,表达式i++
(后自增运算符)的计算结果为 0(即使它将值设置i
为 1)。所以在里面switch
,case 0:
分支被选中。
然后,因为没有break
在 your 之后case 0:
,程序继续执行case 1:
标签中的代码。
总结起来,你有: 0 来自第一个switch
分支,1 来自第二个分支,还有一个 1,因为这是 的最终值i
。
因为您需要break
在每个案例之后添加一个,这会阻止执行以下语句。例如
switch(i++)
{
case 0:
cout<<0;
break;
case 1:
cout<<1;
break;
}
诚然,第二次休息是多余的,但我把它放在那里只是为了保持一致性
你需要把“break;” 在每个案例结束时。
switch 是一个奇怪的结构。它来自 C,Java 和 C# 也采用了它,因此不能认为它是完全“非 OO”的。
switch on state which changes 是一个有效的 OO 概念,但通常用于基于类型的切换。
特别是编译器通常会创建一个“跳转”表,这意味着它是 O(1) 什么代码块被调用,这与嵌套的“if”语句不同。您可能有多个值(不包括默认值)跳转到同一点,因此除非您明确插入“break”语句,否则代码块会相互“运行”。
这就是它在 C 中的完成方式,并且一直保留在 C++ 中。
关于开关中的值,它必须是数值,但不一定是常数。在您的情况下i++
,计算结果为 0,但将 i 增加到 1。这是定义明确的行为,此处的序列点没有问题。