не могу понять вывод для оператора switch для входа 3 - PullRequest
1 голос
/ 03 июня 2019

Я не получаю это .. пожалуйста, помогите мне найти способ оценки этого кода.(входное значение 3)

int a = 9, b;

scanf("%d", &b);

switch(a+b)
{
    case 3:
        a+= b * 2 - (a-b);
        b = a + b;
    default:
        a-= b * 2 - (a-b);
        b = a - b;
    case 9:
        a+= a * 3 - (a-b);
        b = a/b;
        break;
    case 5:
        a%=b;
}
printf("a = %d\nb = %d\n",a,b);

выходное значение для входа 3 (фактическое):

33 5

не должно быть так, как в следующих двух (ожидается):

9 6

Ответы [ 2 ]

1 голос
/ 03 июня 2019

В конце случаев 3 или default нет оператора break, поэтому код перебирает в следующих случаях, пока не встретится break или до конца из switch достигнут.

Обязательно добавляйте break после каждого случая. Кроме того, случай default должен идти внизу по соглашению:

switch(a+b)
{
    case 3:
        a+= b * 2 - (a-b);
        b = a + b;
        break;
    case 9:
        a+= a * 3 - (a-b);
        b = a/b;
        break;
    case 5:
        a%=b;
        break;
    default:
        a-= b * 2 - (a-b);
        b = a - b;
        break;
}
1 голос
/ 03 июня 2019

Причина, по которой он не работает, заключается в том, что после завершения default: отсутствует break;, поэтому управление продолжается в коде для case 9. Вот это исправлено:

int a = 9, b;

scanf("%d", &b);

switch(a+b)
{
    case 3:
        a+= b * 2 - (a-b);
        b = a + b;
        break;
    case 5:
        a%=b;
        break;
    case 9:
        a+= a * 3 - (a-b);
        b = a/b;
        break;
    default:
        a-= b * 2 - (a-b);
        b = a - b;
        break;
}
printf("a = %d\nb = %d\n",a,b);

Кроме того, для удобства чтения лучше упорядочить регистры каким-либо образом, а не только случайным образом; default также всегда идет внизу.

...