Я полагаю, что «что вы наблюдаете» очень ясно в том смысле, что вы должны увидеть что-то. Это почти наверняка означает написание кода и анализ того, что происходит.
В любом случае логические операторы воспринимают 0
как ложь, а все остальное - как истину. Выход этих операторов равен 0
для false и 1
для true.
Также имейте в виду, что операторы pre-increment и -decrement изменяют значение перед use.
И, наконец, имейте в виду, что &&
и ||
являются операторами короткого замыкания, что означает, что второе подвыражение не всегда может быть оценено. Например:
int x = 1 ; int y = 5 ; int z = --x && --y;
оставит y
равным 5, потому что --x
- ноль / ложь, поэтому мы знаем, что все выражение будет ложным - нет необходимости оценивать вторую подпоследовательность. выражение.
Этого должно быть достаточно, чтобы выяснить, каковы результаты, исходя из ваших предварительных условий для x
и y
.
В качестве подсказки, давайте посмотрим на первом. ++x
и ++y
будут 2
и 6
соответственно, так что оба значения верны. Следовательно, true && true
даст значение true, в итоге получится 1
.
А теперь, поскольку вы написали некоторый код (согласно вашему комментарию, спрашивающему о том, что вы считаете странным поведение операторов --
и ++
в некоторых случаях), вот мой пример кода, который показывает операции:
#include <stdio.h>
int main() {
int x, y, z;
x = 1; y = 5; printf("oldx = %d, oldy= %d", x, y);
z=++x && ++y;
printf(", newx= %d, newy = %d, z = %d\n", x, y, z);
x = 1; y = 5; printf("oldx = %d, oldy= %d", x, y);
z=--x && --y;
printf(", newx= %d, newy = %d, z = %d\n", x, y, z);
x = 1; y = 5; printf("oldx = %d, oldy= %d", x, y);
z=++x || ++y;
printf(", newx= %d, newy = %d, z = %d\n", x, y, z);
x = 1; y = 5; printf("oldx = %d, oldy= %d", x, y);
z=--x || --y;
printf(", newx= %d, newy = %d, z = %d\n", x, y, z);
return 0;
}
Вывод этого:
oldx = 1, oldy= 5, newx= 2, newy = 6, z = 1
oldx = 1, oldy= 5, newx= 0, newy = 5, z = 0
oldx = 1, oldy= 5, newx= 2, newy = 5, z = 1
oldx = 1, oldy= 5, newx= 0, newy = 4, z = 1