2013-05-15 2 views
1

при объяснении константные выражения, стандарт (ну, проект N1570) дает Тхи "поучительный" пример:Как оценивается это постоянное выражение?

118)
Таким образом, в следующей инициализации
статические INT I = 2 || 1/0;
выражение является допустимым целочисленным постоянным выражением со значением один.

Как оценивается это выражение?

ответ

4

Логический или || всегда возвращает либо 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.

+0

Но почему '' 'оценивается перед'/'? – Vorac

+0

* Для некоторых операторов (||, &&,?:,,) Задан порядок оценки операндов * - так вот оно! – Vorac

+0

И в частности, что '1/0' здесь вообще не оценивается. Если бы он был оценен, вы, вероятно, получите ошибку компиляции (разделите на ноль). –

Смежные вопросы