Ваш вопрос касается двух отдельных вопросов.
Первый: почему I
увеличивается?
Второй: Если вывод 2 1 1
и I
был увеличен, почему не J
и K
затем тоже увеличивается?
1.
Почему увеличивается I
?
++
является оператором приращения. Он увеличивает операнд на число 1
, аналогично выражениям i = i + 1
или i += 1
, где i
обозначает операнд.
Существует разница между набором ++
перед (++i
) или позади (i++
) операнда. Ответы на следующий связанный вопрос касаются разницы в лучшем виде, поэтому я не буду go слишком подробно описывать эту топи c здесь, поскольку различие не является критически важным для предоставленного вами кода, и я просто хотел аннотировать то обстоятельство, что вы правильно используете оператор приращения в ваших будущих программах и избегаете дальнейших путаницы.
C: В чем разница между ++ i и i ++?
Вернуться к вашему коду.
Поскольку вы используете:
printf("%d\n", ++I || ++J && ++K);
I
сразу увеличивается на 1
внутри выражения, поэтому его значение на самом деле 2
, хотя это не влияет на логическую оценку, потому что любое значение, отличное от нуля, будет оценено как 1
/ true
в результате теста логического условия.
Именно поэтому
printf("%d %d %d", I, J ,K);
печатает 2
как значение I
.
2.
Почему тогда значения J
и K
тоже не увеличиваются?
Логическое тестирование Ева luates слева направо. &&
имеет более высокий приоритет, чем ||
. &&
комбинированные выражения / подусловия должны выполняться вместе, чтобы быть оцененными как true
условие. Как только условие становится true
, как в случае ++I
, оценка оставшихся условий опускается, поскольку она является избыточной.
Именно поэтому J
и K
aren Не увеличивается на 1
с:
printf("%d\n", ++I || ++J && ++K);
, но I
равно.
Таким образом, правильный вывод
printf("%d %d %d", I, J ,K);
равен:
2 1 1