改变的情况下
在下面的代码中开关变量:改变的情况下
int i = 0;
switch(i)
{
case 0:
cout << "In 0" << endl;
i = 1;
break;
case 1:
cout << "In 1" << endl;
break;
}
会发生什么?它会调用未定义的行为吗?
没有未定义的行为。但i
的值仅在代码达到switch (i)
时才被测试。因此case 1:
将被跳过(由break;
声明)。
switch
关键字并不意味着“每当i
的值为0/1时运行代码”。这意味着,检查什么i
是现在,并基于此运行代码。它不关心未来会发生什么i
。
事实上,它有时有用的事:
for(step = 0; !cancelled; ++step) {
switch (step)
{
case 0:
//start processing;
break;
case 1:
// more processing;
break;
case 19:
// all done
return;
}
}
而改变控制变量中构建时,有限状态机(尽管不是必需的,因为你可以设置next_state
里面的一个case
块是极为常见之后进行分配state = next_state
)。
您中断在将此开关语句设置为1后,将其设置为1,这是定义的行为,因此它永远不会输入case 1
。
如果没有“break”,行为仍然会被很好地定义(但不同)。 –
是的,它会通过并打印两者,而与下一个值为情况1的事实无关。 – Joe
这里没有问题。达到开关条件时的表达式进行评估。它不一定是一个变量,如果它是变量,可以随后修改,而不会对switch语句的行为产生任何影响。
你的输出将是:
“0”,即使您指定的值i = 1,它不会反映出来,因为交换机不重复操作,这是一个时间选择为突破将
使其脱离switch语句。
为什么呢?如果你期待'case 1'被执行,因为你把'i'改成了1,那么也不会发生这种情况,因为一旦'case'结尾处的'break'被执行到达'switch'语句的末尾0“。 – Praetorian