为什么这个程序打印"nine"两次?
Why does this program print "nine" twice?
实时版本: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;
}
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- C++两次定义相同的函数会导致错误
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 使用柯南打包时如何避免列出两次依赖?
- 为什么要执行两次位移((x >> 4)<< 4)?
- 对结构向量进行两次排序
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 为什么这个程序打印"nine"两次?