Глядя на это выражение:
i < j || ++j < k
Оператор преинкремента ++
имеет наивысший приоритет, за которым следует оператор меньше 100 *, за которым следует логический оператор ИЛИ ||
. Таким образом, он анализируется следующим образом:
(i < j) || ((++j) < k)
Логический оператор ИЛИ ||
оценивается как true (в частности, значение 1), если либо левая сторона, либо правая сторона оценивается как true. Из-за этого у него также есть свойство, что правая сторона не будет оцениваться, если левая сторона оценивается как true, поскольку результат всего выражения уже известен в этой точке. Обычно это называется оценка короткого замыкания .
Такое поведение продиктовано разделом 6.5.14p3 C стандарта относительно логического оператора ИЛИ:
В отличие от побитового оператора |
, оператор ||
гарантирует оценку слева направо ; если вычисляется второй операнд, между оценками первого и второго операндов существует точка последовательности. Если первый операнд сравнивается с неравным 0, второй операнд не оценивается.
Возвращаясь к выражению, i < j
вычисляется первым. Значение i
равно 3, а значение j
равно 4, поэтому 3 < 4
оценивается как 1. Поскольку это значение левой стороны оператора ||
, результат оператора ||
равен 1, а правая часть ++j < k
не оценивается, поэтому j
никогда не увеличивается.