2016-10-29 3 views
0

Почему результат «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); 
+2

Потому что '0' и что-то' 0'. –

+2

Неопределенное поведение. –

+0

@SamiKuhmonen это? можете ли вы объяснить это, пожалуйста? Он выглядит нормально – Tibrogargan

ответ

1

Если вы собираете это с cc вы получите предупреждение:

warning: unsequenced modification and access to 'x' [-Wunsequenced]` 

Изменение переменной и при доступе к нему в другом месте в пределах printf не определено поведение и не даст логический результат, ни тот же результат на каждом компиляторе.

0

Как отметил в своем комментарии @Sami, порядок оценки аргументов является специфичным для компилятора и, вероятно, зависит от соглашения о вызовах. В вашем случае аргумент x && y вычисляется первым до ++x || !y.

+0

Будет ли порядок аргументов в данном случае? Из комментария @ EliSadoff - '0' && что угодно' 0' – Tibrogargan

+0

Порядок A и B в A && B не будет иметь значения из-за приоритета оператора. Например, ++ и! операторы имеют более высокий приоритет, чем || поэтому всегда будет оценено сначала – Steztric

+0

Да, это очевидно (и весьма полезно - я бы хотел, чтобы ОП спросил об этом). Это все еще не отвечает на реальный вопрос - (комментарий Эли - это действительно ответ) – Tibrogargan

3
printf("3: %d %d %d %d\n", ++x || !y, x&&y, !z, y); 

++x вычисляется до !y из-за ||. !y оценивается только если ++x результат был 0.

Но нет никакого указанного порядка в ++x || !y VS. x&&y оценки. Коду не хватает пункт последовательности.