Логический или ||
всегда возвращает либо 0, либо 1. Сначала его левый операнд, а затем, если оценка левого операнда в результате 0, то правый операнд вычисляется и значение выражения равно 0 если правый операнд также оценивает 0, 1 в противном случае. Если оценка левого операнда привела к ненулевому значению, все выражение оценивается в 1 без оценки правильного операнда.
Приоритет оператора деления /
выше, чем приоритет логического или, выражение
2 || 1/0
неявно в скобки
2 || (1/0)
как выражение дерева:
(||)
/ \
2 (/)
/ \
1 0
Приоритет определяет форму t он, но порядок оценки не зависит от приоритета (за исключением того, что приоритет определяет зависимости данных). Для некоторых операторов (||
, &&
, ?:
, ,
) указан порядок оценки операндов [и правильные операнды ||
и &&
не оцениваются вообще, если результат уже определен после оценки левого операнда, а второго и третьего операндов ?:
оценивается только один - который определяется оценкой первого операнда], как правило, порядок оценки дочерних узлов оператора-узла неуточнен.
Так как левый операнд ||
в
static int i = 2 || (1/0);
(константа выражение 2
) вычисляется в ненулевое значение, то вычисление выражения прекращается там и значение
2 || 1/0
1 .
Оценка ||
указана в пункте 6.5.14, параграф 4:
В отличие от поразрядного оператора |
оператор ||
гарантирует оценку слева направо; если второй операнд оценивается, то существует точка последовательности между оценками первого и второго операндов.Если первый операнд сравнивается с не равным 0, второй операнд не оценивается.
и ее возвращаемое значение там же, пункт 3:
||
оператор должен дать 1, если любой из операндов сравнивать не равно 0; в противном случае он дает 0. Результат имеет тип int
.
Но почему '' 'оценивается перед'/'? – Vorac
* Для некоторых операторов (||, &&,?:,,) Задан порядок оценки операндов * - так вот оно! – Vorac
И в частности, что '1/0' здесь вообще не оценивается. Если бы он был оценен, вы, вероятно, получите ошибку компиляции (разделите на ноль). –