Почему переменная не увеличивается? - PullRequest
0 голосов
/ 13 февраля 2019

Оператор приращения не работает.

Я изучал выражения языка Си.Я также пробовал разные комбинации операторов приращения (префикс и постфикс) для переменных, но результат получается одинаковым.

int i=-3, j=2 ,k=0,m;

m=++i&&++j||++k;

printf("%d%d%d%d\n",i,j,k,m);  

Я ожидаю, что на выходе будет -2311, но получается -2301.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Операторы && и || короткое замыкание - в зависимости от значения в левой части выражения правая часть может вообще не оцениваться.

Для выражения a || b, если a не равно нулю, то результат a || b равен 1 независимо от значения b, поэтому b не оценивается,Для выражения a && b, если a равно нулю, то результат a && b равен нулю независимо от значения b, поэтому b не оценивается.

В вашем случае результат ++i && ++j не равен нулю, поэтому ++k не оценивается.

0 голосов
/ 13 февраля 2019

i и j увеличиваются, потому что i необходимо оценить.j также необходимо оценивать, поскольку i не равно нулю.

Но поскольку это объединенное выражение не равно нулю, || короткое замыкание, а k++ не оценивается и не выполняется.

С другой стороны, побитовые операторы не закорачивают.Они также не конвертируются в логические значения.Если вы хотите оценить все условия и сохранить один и тот же результат, вы можете написать

m= (!!++i) & (!!++j) | (!!++k);

, используя трюк двойного отрицания для преобразования целочисленного значения в логическое значение.

Или сэкономить другое утверждение и упростить до (Предоставлено пользователем 694733):

++i; ++j; ++k;
m = i && j || k;
...