C++中Switch语句中的Do While循环
Do-While Loop within Switch Statement in C++
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
int n = 12;
int q = (n + 3) / 4;
cout << q;
cout << ' ';
cout << n%4;
cout << ' ';
switch (n % 4) {
case 0: cout << n; cout << ' ';
do { n++; cout << n; cout << ' ';
case 3: n++; cout << n; cout << ' ';
case 2: n++;
case 1: n++; cout <<n; cout << ' ';
} while (--q > 0);
}
cout << n;
}
使用上面的代码,我得到了以下内容:
3 0 12 13 14 16 17 18 20 21 22 24 24
我不熟悉C++语言。
为什么它会在while循环的第二次和第三次迭代中失败?
switch case语句是否保存初始的n%4值,并在do while循环期间应用该值?
大小写标签只是标签。在switch语句中,代码是按顺序执行的,因为没有跳转语句,例如break、goto或return。
为了更清楚地表明,当表达式n % 4
等于0时,可以按以下方式重写switch语句。
goto Label0;
{
Label0: cout << n; cout << ' ';
do { n++; cout << n; cout << ' ';
n++; cout << n; cout << ' ';
n++;
n++; cout <<n; cout << ' ';
} while (--q > 0);
}
所以,如果你将运行你的程序与修改
#include <iostream>
using namespace std;
int main()
{
int n = 12;
int q = (n + 3) / 4;
cout << q;
cout << ' ';
cout << n%4;
cout << ' ';
goto Label0;
{
Label0: cout << n; cout << ' ';
do { n++; cout << n; cout << ' ';
n++; cout << n; cout << ' ';
n++;
n++; cout <<n; cout << ' ';
} while (--q > 0);
}
cout << n; return 0;
}
你会得到同样的结果。
3 0 12 13 14 16 17 18 20 21 22 24 24
例如,如果您将在标签案例2之前插入一个break语句,如
switch (n % 4) {
case 0: cout << n; cout << ' ';
do { n++; cout << n; cout << ' ';
case 3: n++; cout << n; cout << ' ';
break;
case 2: n++;
case 1: n++; cout <<n; cout << ' ';
} while (--q > 0);
}
那么这个break语句实际上就在do-while语句的复合语句中。因此,do while语句将被中断,控制将传递到switch语句的右大括号之前的点。因此switch语句也将被中断。
在这种情况下,程序输出将是
3 0 12 13 14 14
"开关盒";总是失败,除非您明确地将break
从交换机中删除。
开关盒结构本质上是一组美化的goto
,但比手动构建的结构更健壮。
(你的代码看起来像是传说中的"达夫设备"的一个稍微变异的版本,这是一个让几代C程序员感到困惑的循环展开结构。(
翻译成非结构化的";goto码";,您的交换机在逻辑上等同于
int x = n % 4;
if (x == 0)
goto zero;
if (x == 1)
goto one;
if (x == 2)
goto two;
if (x == 3)
goto three;
zero:
cout << n << ' ';
loop:
n++;
cout << n << ' ';
three:
n++;
cout << n << ' ';
two:
n++;
one:
n++;
cout << n << ' ';
if (--q > 0)
goto loop;
但是编译器可能能够通过使用实际的跳转表,从开关创建比该系列条件语句更高效的代码。
脚注:gcc实际上允许您使用标签作为值并跳转到它们,因此您可以自己创建这样的表;
void* table = { &&zero, &&one, &&two, &&three };
goto *table[n % 4];
zero:
cout << n << ' ';
loop:
n++;
cout << n << ' ';
three:
n++;
cout << n << ' ';
two:
n++;
one:
n++;
cout << n << ' ';
if (--q > 0)
goto loop;
(并不是说你应该,但你<em]可以>。一个好的编译器会把你的开关编译成类似的东西,如果它是有益的,它比一个人更了解这一点。(
相关文章:
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- while循环中while循环的时间复杂度是多少
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 擦除while循环中迭代的元素
- 为什么我不能在 while 循环中创建线程?
- 退出简单while循环时出现问题
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 嵌套While循环不起作用(C++问题)
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 使用 GMP 的 while 循环出现问题
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 为什么在 while 循环中返回表达式不起作用
- 如何使用 do while 循环确定最高值和最低值
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- OpenCV QT,显示视频的帧(不使用while循环)
- 在 while 循环中使用 pow() 函数 C++
- C++ 制作/命名不初始化的向量(在 while 循环中)
- std::getline没有在while循环中重新请求用户输入