用开关块不了解程序的输出

时间:2019-11-06 21:27:25

标签: c switch-statement fall-through

我想了解这段代码的输出,特别是输出的最后2行(第4和5行)。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    double x = 2.1;

    while (x * x <= 50) {
        switch ((int) x) {
            case 6:
                x--;
                printf("case 6, x= %f\n ", x);

            case 5:
                printf("case 5, x=%f\n ", x);

            case 4:
                printf("case 4, x=%f\n ", x);
                break;

            default:
                printf("something else, x=%f\n ", x);
        }

        x +=2;
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

没有break语句,一种情况下的代码将落入下一种情况的代码中。

因此,当x达到值6.1时,由于x*x仍然小于50,因此您击中了case 6,并且没有break语句,您还输入了{{1} }和case 5代码。因此,值5.1(递减case 4的结果)将打印3次。

这是一个很好的机会来强调您应该在启用所有警告的情况下编译代码。使用x,您的程序将生成以下警告:

gcc -W -Wall

如果您的代码是故意要陷入下一个情况的,.code.tio.c: In function ‘main’: .code.tio.c:12:17: warning: this statement may fall through [-Wimplicit-fallthrough=] printf("case 6, x= %f\n ", x); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .code.tio.c:14:13: note: here case 5: ^~~~ .code.tio.c:15:17: warning: this statement may fall through [-Wimplicit-fallthrough=] printf("case 5, x=%f\n ", x); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ .code.tio.c:17:13: note: here case 4: ^~~~ 将接受注释该意图的注释。该警告将不会发出。

gcc