Поскольку левый операнд операции имеет
вначале x=1, y=1, z=1 ++x ++y && ++z |
|
((++x)(++y)&&(++z)) |
Сопоставляем операнды с операциями. |
(2(++y)&&(++z)) и x=2 |
Вычисляем выражение слева направо |
(TRUEчто-то еще) |
Поскольку левый операнд операции имеет значение ИСТИНА, нет смысла проводить вычисления дальше. Фактически в языке С гарантируется, что в подобных случаях вычисления прекращаются. Иными словами, логическое выражение вычисляется слева направо до тех пор, пока не станет известно его значение, т.е. для данной задачи x и y останутся равными 1. |
вначале x=1, y=1, z=1 ++ x && ++ y ++ z (((++x)&&(++y))(++z)) ((TRUE&&(++y))(++z)) и x=2 |
|
((2&&2)(++z)) и y=2 |
Вычисляем выражение слева направо |
(TRUE(++z)) |
|
TRUE или 1 |
Значение z не меняется |
вначале x=1, y=1, z=1 ++ x && ++ y && ++ z (((++x)&&(++y))&&(++z)) ((2&&2)&&(++z)) и x=2, y=2 (TRUE&&(++z)) (TRUE&&TRUE) и z= 2 TRUE или 1
вначале x=-1, y=-1, z=-1 ++ x && ++ y ++ z (((++x)&&(++y))(++z)) ((0&&(++y))(++z)) и x=0 ((FALSE&&(++y))(++z)) |
|
(FALSE(++z)) |
Здесь нет необходимости вычислять ++y, так как левый операнд логической операции && есть ЛОЖЬ. Но результат логической операции пока еще неизвестен. |
(FALSE(0)) и z=0 (FALSEFALSE) FALSE или 0 |
|
вначале x=-1, y=-1, z=11 ++ x ++ y && ++ z ((++x)((++y)&&(++z))) (FALSE((++y)&&(++z))) и x=0 (FALSE(FALSE&&(++z))) и y=0 (FALSEFALSE) FALSE или 0
вначале x=-1, y=-1, z=11 ++ x && ++ y && ++ z (((++x)&&(++y))&&(++z) ((FALSE&&(++y))&&(++z) и x=0 (FALSE&&(++z)) FALSE или 0
Относительно побочных эффектов при вычислении логического выражения. К этому моменту вы уже без сомнения могли заметить, что вычисление логических выражений в С может быть коварным, поскольку вычисление правой части выражения может проводиться в зависимости от значения левой его части. На самом деле такое условное вычисление является полезным свойством логических операций. Проблемы возникают только, когда правая часть логического выражения содержит побочный эффект; иногда побочный эффект будет иметь место, а иногда и нет. Так что если вообще побочными эффектами нужно пользоваться с осторожностью, то в логических выражениях это следует делать сверхосторожно.
Содержание раздела