繁体   English   中英

switch 子句中的 C while 语句

[英]C while statement in switch clause

这道题来自我的C语言考试。 它要求结果。

#include <stdio.h>

int main()
{
    int a = 4, b = 30;
    printf("%d\n", a);

    switch(a){
        case 1: a = a*10; break;
        case 2: a = a*10; break;
        case 3: a = a*10;
        while (a<b) case 4: {a = a+5;} break; //???
        case 5: a = a*10; break;
        default:
            b = a*10;break;
    }
    printf("%d\n", a);

    return 0;
}

结果是:

4
34

我知道while语句和switch语句的基本思想,但是不明白switch块的第四行是怎么回事。

我的猜测是 while 条件被测试 7 次,直到变量 a 达到 34(4<30,4+5+5+5+5+5+5 = 34)。 但是“情况 4”条件如何呢? 在将 5 添加到变量 a 之前不应该测试这个条件吗? 之后的“休息”怎么样? 我完全糊涂了。

谢谢!

while (a<b) case 4: {a = a+5;} break; //???

case 4只是一个标签。

这等效于以下内容:

while (a<b) 
some_label:
{
   a = a+5;
}
break; //This will break out of the surrounding switch.
while (a<b) case 4: {a = a+5;} break; 

这行代码在switch语句中。 switch所做的第一件事是跳转到case标签4

但是这个案例标签在一个 while 循环中 a=a+5指令结束时,程序“返回”到 while 指令。

在这个节目确实是执行goto内部while循环。

不鼓励使用goto语句,除非在switch块中具有完全清晰的结构,例如:

  switch(a)
  {
    case 1: a = a*10; break;
    case 2: a = a*10; break;
    case 5: a = a*10; break;
    default:
        b = a*10;break;
}

如果你想变得聪明,省略break ,在break和下一个case之间插入指令......你必须意识到你在做什么。 阅读代码的其他人可能很难解释它。

这也意味着不要在循环结构或类似的奇怪事情中间跳跃。

如果您在现实生活中遇到这样的代码,请重写它。 等效的将使用do ... while指令(跳过第一个测试,即使a<b ,我们也可以进入循环:

case 4: do {a = a+5;} while (a<b); break; 

使用此代码可以获得相同的结果,除了它在编译时没有警告并且每个人都理解它的作用。

就像你说的,while(a < b)每次都会重复case 4,给a加5,当a大于30时,会跳出while循环,切换作用域。 然后它将打印现在等于 34 的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM