Не понимаю вывод программы с блоком переключателей - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу понять вывод этого кода, в частности 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 Ответ

1 голос
/ 07 ноября 2019

Без оператора break код в конце одного случая будет преобразован в код следующего случая.

Итак, когда x достигает значения 6.1, так как x*x все ещеменьше 50, вы нажимаете case 6, и без оператора перерыва вы также вводите код case 5 и case 4. Таким образом, значение 5.1 (результат уменьшения x) печатается 3 раза.

Это хорошая возможность подчеркнуть, что вы должны скомпилировать свой код со всеми включенными предупреждениями. С 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 будет учитывать комментарийкомментируя это намерение. Предупреждение не будет отправлено.

    switch ((int) x) {
        case 6:
            x--;
            printf("case 6, x= %f\n ", x);
            // FALLTHROUGH
        case 5:
            printf("case 5, x=%f\n ", x);
            // FALLTHROUGH
        case 4:
            printf("case 4, x=%f\n ", x);
            break;

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