在以下代码中:
int i = 0;
switch(i)
{
case 0:
cout << "In 0" << endl;
i = 1;
break;
case 1:
cout << "In 1" << endl;
break;
}
会发生什么?它会调用未定义的行为吗?
答案 0 :(得分:10)
没有未定义的行为。但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;
}
}
在构建有限状态机时,更改case
块内的控制变量非常常见(尽管不是必需的,因为您可以在next_state
内设置case
,并执行之后分配state = next_state
。
答案 1 :(得分:1)
这里没有问题。到达时,将评估切换条件中的表达式。它不必是变量,如果是变量,则可以随后修改变量而不会对switch语句的行为产生任何影响。
答案 2 :(得分:0)
将中断后,将其设置为1,这是已定义的行为,因此它将永远不会输入case 1
。
答案 3 :(得分:0)
您的输出将是:
“在0”
即使你赋值i = 1它也不会被反映,因为switch在迭代中不运行,它是一次选择,因为break会使它超出switch语句。