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

Why does this program print "nine" twice?

本文关键字:nine 两次 打印 程序 为什么      更新时间:2023-10-16

实时版本: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 << "onen";
                case 2: cout << "twon";
                case 3: cout << "threen";
                case 4: cout << "fourn";
                case 5: cout << "fiven";
                case 6: cout << "sixn";
                case 7: cout << "sevenn";
                case 8: cout << "eightn";
                case 9: cout << "ninen";
            }
      }
      else if(n % 2 == 0){ //even
            cout << "evenn";
      }
      else if(n > 9 && n %2 == 1){ //odd
            cout << "oddn";
      }
   }
    return 0;
}

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

eight
nine
nine
even
odd

为什么?

因为你没有break,而且是失败的情况。

case 8: cout << "eightn";  // <-- need break here
case 9: cout << "ninen";   // otherwise it's fall-through to here even input is 8
  • 好的做法是在每次case switch始终break
  • 如果你需要故意跌倒,那么明确评论那个失败。

因为您的开关大小写中没有中断语句:

if(n <= 9){
        switch(n){
            case 1: cout << "onen";
            case 2: cout << "twon";
            case 3: cout << "threen";
            case 4: cout << "fourn";
            case 5: cout << "fiven";
            case 6: cout << "sixn";
            case 7: cout << "sevenn";
            case 8: cout << "eightn";
            case 9: cout << "ninen";
        }
  }

当调用案例 8 时,它首先打印 8,然后下降到案例 9 并打印 9。然后当 n 为 9 时调用案例 9,再次打印 9。在大小写后添加中断语句,例如:

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

切换的每个案例之后都中断是个好主意,除非是故意的。

为了避免将来出现此类问题,您应该了解在每个case :语句末尾没有实现定义的隐式break;用例

请考虑以下示例以了解"跌倒"的好处:

switch (day) {  
    case MONDAY:
    case TUESDAY:
    case WEDNESDAY:
    case THURSDAY:
    case FRIDAY:
        cout << "Weekday";  //same for all five mentioned days of the week.
        break;   // << yes, you need a explicit "break" statement to stop this fall through
    case SATURDAY:
    case SUNDAY:
        cout << "yeah! it's a Weekend";  //same for Sat and Sun.
        break;  //not necessary, but a good practice.
}

切换大小写的基本规则是,如果您没有在大小写后中断,它也会进一步打印。所以在这里你没有在

Case 8 : cout << "eightn"
//Put break here
Case 9: cout << "ninen"

因此,对于单打印 9,您必须在案例 8 之后放置中断。

你的代码应该看起来像这样

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 << "onen";
                break;
                case 2: cout << "twon";
                break;
                case 3: cout << "threen";
                break;
                case 4: cout << "fourn";
                break;
                case 5: cout << "fiven";
                break;
                case 6: cout << "sixn";
                break;
                case 7: cout << "sevenn";
                break;
                case 8: cout << "eightn";
                break;
                case 9: cout << "ninen";
                break;
            }
      }
      else if(n % 2 == 0){ //even
            cout << "evenn";
      }
      else if(n > 9 && n %2 == 1){ //odd
            cout << "oddn";
      }
   }
    return 0;
}