Почему результат «3: 1 0 0 4», когда мы увеличили x? Почему это не "3: 1 1 0 4"?Логические выражения в C
x=0;y=4;z=3;
printf("3: %d %d %d %d\n", ++x || !y, x&&y, !z, y);
Почему результат «3: 1 0 0 4», когда мы увеличили x? Почему это не "3: 1 1 0 4"?Логические выражения в C
x=0;y=4;z=3;
printf("3: %d %d %d %d\n", ++x || !y, x&&y, !z, y);
Если вы собираете это с cc
вы получите предупреждение:
warning: unsequenced modification and access to 'x' [-Wunsequenced]`
Изменение переменной и при доступе к нему в другом месте в пределах printf
не определено поведение и не даст логический результат, ни тот же результат на каждом компиляторе.
Как отметил в своем комментарии @Sami, порядок оценки аргументов является специфичным для компилятора и, вероятно, зависит от соглашения о вызовах. В вашем случае аргумент x && y
вычисляется первым до ++x || !y
.
Будет ли порядок аргументов в данном случае? Из комментария @ EliSadoff - '0' && что угодно' 0' – Tibrogargan
Порядок A и B в A && B не будет иметь значения из-за приоритета оператора. Например, ++ и! операторы имеют более высокий приоритет, чем || поэтому всегда будет оценено сначала – Steztric
Да, это очевидно (и весьма полезно - я бы хотел, чтобы ОП спросил об этом). Это все еще не отвечает на реальный вопрос - (комментарий Эли - это действительно ответ) – Tibrogargan
printf("3: %d %d %d %d\n", ++x || !y, x&&y, !z, y);
++x
вычисляется до !y
из-за ||
. !y
оценивается только если ++x
результат был 0.
Но нет никакого указанного порядка в ++x || !y
VS. x&&y
оценки. Коду не хватает пункт последовательности.
Потому что '0' и что-то' 0'. –
Неопределенное поведение. –
@SamiKuhmonen это? можете ли вы объяснить это, пожалуйста? Он выглядит нормально – Tibrogargan