更改案例内的开关变量

时间:2011-11-30 22:13:18

标签: c++ switch-statement

在以下代码中:

int i = 0;

switch(i)
{
    case 0:
        cout << "In 0" << endl;
        i = 1;
        break;
    case 1:
        cout << "In 1" << endl;
        break;
}

会发生什么?它会调用未定义的行为吗?

4 个答案:

答案 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语句。