C while в операторе switch - PullRequest
       20

C while в операторе switch

2 голосов
/ 06 января 2020

Этот вопрос возник из моего 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

Я знаю основную c идею операторов while и switch, но я не понимаю, что происходит в четвертой строке блока switch.

My Предполагается, что условие while проверяется 7 раз, пока переменная a не достигнет 34 (4 <30, 4 + 5 + 5 + 5 + 5 + 5 + 5 = 34). Но как насчет условия «случай 4»? Не следует ли проверить это условие перед добавлением 5 к переменной a? А как насчет «перерыва» после него? Я полностью сбит с толку. </p>

Спасибо!

Ответы [ 2 ]

3 голосов
/ 06 января 2020
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.
2 голосов
/ 06 января 2020
while (a<b) case 4: {a = a+5;} break; 

Эта строка кода находится внутри оператора switch. Первое, что делает switch, - это переходит на метку case 4.

. Но метка этого случая через некоторое время l oop. В конце инструкции a=a+5 программа возвращается к инструкции while.

Программа выполняет goto внутри while l oop.

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 ... вы должны знать, что вы делаете. И кому-то другому, читающему код, может быть трудно понять его.

Это также подразумевает, что вы не будете прыгать в середине конструкции oop или подобных странных вещей.

Если вы столкнетесь такой код в реальной жизни, перепишите его. Эквивалент будет использовать инструкцию do ... while (первый тест пропущен, мы можем ввести l oop, даже если a<b:

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

Вы получите тот же результат с этим кодом, за исключением того, что он компилируется без предупреждений, и все понимают, что он делает.

...