Почему с не увеличивается в выводе? - PullRequest
5 голосов
/ 22 февраля 2012

Я работал над Основами C и пытался решить проблему ниже, кто-нибудь может объяснить, почему вывод переменной c отличается?

Каков вывод следующей программы?

int main()
{
   int a = -3, b = 2, c= 0, d;
   d = ++a && ++b || ++c;
   printf ("a = %d,  b = %d, c = %d, d = %d", a, b, c, d);
} 

Ответы: -2, 3, 0, 1

Почему c не увеличивается на выходе?

Ответы [ 5 ]

10 голосов
/ 22 февраля 2012

Переменная c не увеличивается, поскольку RHS (правая сторона) || не выполняется, если LHS не оценивается как false, а LHS оценивается как true.Операторы C || и && являются операторами «короткого замыкания»;они не оценивают второй операнд, если только первый не является достаточным для определения общей истинности выражения.

&& связывается сильнее, чем ||, поэтому операцию можно заключить в скобки как:

d = (++a && ++b) || ++c;

Значение ++a равно -2, что соответствует значению true (, поскольку любое значение, отличное от 0, равно true );значение ++b равно 3, что соответствует истине;поэтому значение && является истинным.Поскольку true || false и true || true оба оценивают как true, нет необходимости оценивать RHS, чтобы знать общий результат.(Аналогичное правило для && состоит в том, что если первый член оценивается как ложный, нет необходимости оценивать второй, потому что общее выражение должно быть ложным. Если у вас было a = -1; до теста, то b не будетбудет увеличено, потому что ++a будет равно нулю или ложно, поэтому RHS && не оценен. Конечно, тогда c будет увеличен, потому что LHS || будет ложным, а RHS будетдолжны быть оценены, чтобы определить общий результат.)

9 голосов
/ 22 февраля 2012

Потому что ++a && ++b оценивается как true.

Это называется коротким замыканием. Выражения внутри условий оцениваются слева направо. Если в вашем случае, если первое условие в предложении OR оценено как true, нет смысла оценивать и второе условие, поскольку известно, что все выражение уже true.

2 голосов
/ 22 февраля 2012
d= ++a && ++b || ++c
d= ++(-2) && ++b || ++c
d= -1 && ++b || ++c
d= true && ++b || ++c
d= true && ++2 || ++c
d= true && true || ++c
d= true || ++c
d= 1

Это примерно так, как это работает за сценой ...

2 голосов
/ 22 февраля 2012

Это оценка ленивых логических выражений.Выполнение:

++a дает -2

++b дает 3

-2 && 3 дает 1

Хорошо!Нет необходимости проверять результат ||.Так что ++c не оценивается.

Правило: часть выражения X не оценивается в случаях: (0 && X), (1 || X).Здесь 1 - это, конечно, «не 0».

2 голосов
/ 22 февраля 2012

В C булевы логические операторы && и || имеют короткое замыкание . Это означает, что они оценивают только свою правую сторону, если оценки левой стороны недостаточно, чтобы узнать ответ.

Для вашего кода это никогда не приводит к оценке ++c, так как левая часть не равна нулю и, следовательно, результат логического или будет истинным, и больше не нужно делать больше.

...