2013-01-18 3 views
0

если это так, то какой будет выход следующей программы.++ имеет более высокий приоритет, чем логический оператор?

#include<stdio.h> 
int main() 
{ 
    int i=-3, j=2, k=0, m; 
    m = ++i || ++j && ++k; 
    printf("%d, %d, %d, %d\n", i, j, k, m); 
    return 0; 
} 

мощность - ** -2 2 0 1 ** под gcc но как?

+0

«человек-оператор», Google найдет его для вас – jthill

+0

Это не важно, не так ли? Вы никогда не напишете такой код в реальной программе. –

+0

ya это правильно, но я очень смущаюсь по поводу порядка оценки, поэтому я спросил – Rasesh

ответ

2

Приоритет определяет группировку операндов и операторов; это не определить порядок оценки. Оценки || и && оценивают слева направо; Сначала оценивается ++i. Если результат не равен 0 (например, в этом случае), то ++j && ++k вообще не оценивается.

3

++i имеет значение -2, который не равен нулю, так что «истина» в логическом контексте и короткоживущих cirtuited условных остановок там и j и k сохраняют свои первоначальные значения. Логическое значение «true» преобразуется в целое число 1, которое присваивается m.

+0

, но pre increment имеет более высокий приоритет, чем || почему ++ j и ++ k не оцениваются до || – Rasesh

+0

Превосходство не связано с секвенированием. Почему не 'return 0;' выполняется до 'int i = -3'? Коротко замыкающая семантика логических операторов вводит четко определенную последовательность. –

+0

@ 5941 '++' действительно имеет сильное преимущество, но в этом случае для * j * это похоже на 'if (0) ++ j;' где '++ j' не выполняется: в выражении, которое вы указали' + + j' также не выполняется, поскольку '++ i' истинно (в логическом выражении, то есть с использованием логических операторов), и нет необходимости выполнять оставшуюся часть выражения. Приоритет выглядит следующим образом: (++ i) || ((++ j) && (++ k)) ', а в' A || B', если 'A' истинно' B' не оценивается, так как это необязательно. Кстати, я не согласен с голосованием: это не очевидная проблема. –

1

Это потому, что логические операторы делают короткое замыкание оценка.

Как только результат известен, оценка не проводится.

В вашем случае, как ++i оценивает до true, а за ним следует или не более выражений.

Что происходит с «приоритетом» в следующем: для вычисления результата || (минимальное «приоритет») компилятор должен сначала вычислить результат того, что находится слева. В вашем случае это дает true, поэтому больше не нужно вычислений, поскольку результат всего выражения известен.

Если необходимо оценить правую сторону, то ++ будет оцениваться до ||.

0

Другие уже объяснили, почему часть после '||' не оценивается. Однако я хотел бы подчеркнуть очень важную часть стандарта, которая приводит к такому поведению. «||» логический оператор действует как точка последовательности , что требует порядка слева направо, независимо от других операторов в том же выражении.

цитата из стандартного ISO/IEC 9899 (6.5.13/14, стр 88)

В отличие от побитового | оператора, || оператор гарантии оценка слева направо; после оценки есть точка последовательности после первого операнда. Если первый операнд сравнивает не равный с 0, второй операнд не оценивается.

Другими словами, выражение «а + Ь * с» отличается от «а || Ь & & С», в том смысле, что бывший трактуется как одно выражение без точек последовательности, в то время как последний является выражением с точками последовательности. Как следует из названия, точки последовательности заставляют последовательность оценки. Как только результат полного выражения оценивается (например, когда LHS of || оценивает значение «1»), дальнейшая оценка выражения может быть остановлена. Следовательно, порядок, который вы видите.

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