【问题标题】:Changing switch variable inside a case在案例中更改开关变量
【发布时间】:2011-11-30 22:13:18
【问题描述】:

在以下代码中:

int i = 0;

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

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

【问题讨论】:

  • 为什么会这样?如果您期望在将 i 更改为 1 后执行 case 1,那么这也不会发生,因为一旦 breakcase 0 的末尾执行将到达 switch 语句的末尾遇到了。

标签: c++ switch-statement


【解决方案1】:

没有未定义的行为。但是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 块内的控制变量非常常见(尽管不是必需的,因为您可以在case 内设置next_state,然后再分配state = next_state) .

【讨论】:

    【解决方案2】:

    您在将 switch 语句设置为 1 后中断,这是定义的行为,因此它永远不会输入 case 1

    【讨论】:

    • 如果没有break,行为仍然可以很好地定义(但不同)。
    • 是的,它会,然后它会通过并打印两者,与下一个值是案例 1 的事实无关。
    【解决方案3】:

    这里没有问题。达到 switch 条件中的表达式时,将对其进行评估。它不一定是变量,如果是变量,则可以随后修改该变量,而不会对 switch 语句的行为产生任何影响。

    【讨论】:

      【解决方案4】:

      您的输出将是:

      “在 0”

      即使你赋值 i = 1 它也不会被反映,因为 switch 不会在迭代中运行,这是一次选择,因为 break 会使其退出 switch 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多