为什么这个程序打印两次"九"?

Lil*_*ter 1 c++

实时版:http://cpp.sh/953y6

代码:

#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    // Complete the code.
    int num1 = 8, num2 = 11;
    for(int n = num1; n <= num2; n++){

        if(n <= 9){
            switch(n){
                case 1: cout << "one\n";
                case 2: cout << "two\n";
                case 3: cout << "three\n";
                case 4: cout << "four\n";
                case 5: cout << "five\n";
                case 6: cout << "six\n";
                case 7: cout << "seven\n";
                case 8: cout << "eight\n";
                case 9: cout << "nine\n";
            }

      }
      else if(n % 2 == 0){ //even
            cout << "even\n";
      }
      else if(n > 9 && n %2 == 1){ //odd
            cout << "odd\n";
      }

   }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

数字8到11在for循环中循环.if(n <= 9)只应触发两次,当n为8且n为9时,输出为:

eight
nine
nine
even
odd
Run Code Online (Sandbox Code Playgroud)

为什么?

art*_*rtm 14

因为你没有break并且它是堕落的情况.

case 8: cout << "eight\n";  // <-- need break here
case 9: cout << "nine\n";   // otherwise it's fall-through to here even input is 8
Run Code Online (Sandbox Code Playgroud)
  • 好的做法是始终 break在每一个case之后switch.
  • 如果你需要有意识地进行贬低,那么就该堕落做出明确的评论.


upt*_*ood 7

因为你的交换机案例中没有break语句:

if(n <= 9){
        switch(n){
            case 1: cout << "one\n";
            case 2: cout << "two\n";
            case 3: cout << "three\n";
            case 4: cout << "four\n";
            case 5: cout << "five\n";
            case 6: cout << "six\n";
            case 7: cout << "seven\n";
            case 8: cout << "eight\n";
            case 9: cout << "nine\n";
        }

  }
Run Code Online (Sandbox Code Playgroud)

当案例8被调用时,它首先打印8,然后落到案例9并打印9.然后在n为9时调用案例9,再次打印9.在以下情况之后添加break语句:

if(n <= 9){
        switch(n){
            ...
            case 8: cout << "eight\n";
                    break;
            case 9: cout << "nine\n"; //last case, dont really need a break
        }

}
Run Code Online (Sandbox Code Playgroud)

在切换后的每个案例之后放置休息是个好主意,除非是故意的.