【问题标题】:C++ for loop and switch statement logic errorC++ for循环和switch语句逻辑错误
【发布时间】:2011-07-19 23:11:51
【问题描述】:

在这个循环中(假设amount是2),而不是打印:

1. [op1]
2. [op2]

打印出来:

1. [op1]
2. [op2]
3. [op3]
4. [op4]
5. [op5]

为什么?我该如何解决这个问题?

for(int i=1;i<=amount;i++){
            //string s;
            switch(i){
            case 1:
                cout << i << ". " << op1 << endl;
                //s = op1;
            case 2:
                cout << i << ". " << op2 << endl;
                //s = op2;
            case 3:
                cout << i << ". " << op3 << endl;
                //s = op3;
            case 4:
                cout << i << ". " << op4 << endl;
                //s = op4;
            case 5:
                cout << i << ". " << op5 << endl;
                //s = op5;
            }
            //cout << i << ". " << s << endl;
        }

【问题讨论】:

  • 把 switch 想象成一个美化的goto:它跳转到一个案例,然后从那里开始,就好像这个案例是一个标签,而标签是由switch 表达式选择的。要停止执行,请在案例末尾使用break;
  • 你应该得到[op1] [op2] [op3] [op4] [op5] [op2] [op3] [op4] [op5],对吧?
  • @Vlad - 是的,这就是 OP 应该得到的。
  • 这看起来类似于 Duff 的设备:en.wikipedia.org/wiki/Duff%27s_device

标签: c++ loops for-loop switch-statement


【解决方案1】:

您需要使用break;switch() 才会有所谓的"fallthrough"

(这意味着它会执行您的案例:然后继续执行之后的任何内容,包括其他案例语句中的代码)。

【讨论】:

    【解决方案2】:

    你需要放

    break;
    

    在每个案例的末尾。否则,它会转到 case1,然后继续到选择结束。 (案例1、2、3、4、5)

    【讨论】:

      【解决方案3】:

      您必须在每个case:-parts 的末尾插入break;-statements。

      这是因为 switch () {} 只是 goto 的重新表述,案例只是标签,而不是真正的块(这就是为什么他们使用标签语法而不是像 case ... { } 这样的块语法。

      【讨论】:

        【解决方案4】:

        在case后面加上一个“break”语句,否则控制流将直接通过。

        【讨论】:

          猜你喜欢
          • 2012-03-25
          • 2023-04-10
          • 2021-09-09
          • 2015-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多