2013-04-11 2 views
1

Оператор + имеет более высокий приоритет, чем << в C++, который будет означать, что выражение a << b + c << d следует оценивать как:Непонятный оператор старшинства: а << Ь + с << d

a << (b + c) << d 

Но что не делает смысл. Больше смысла может быть получен при следующих

a << (b + (c << d)) 

Но это нарушает приоритет в + над <<, не так ли? Как компиляторы оценивают часть «делает ли смысл»?

ОБНОВЛЕНИЕ: При задании вопроса я думал, что второй вариант используется компилятором, поэтому мне интересно, как компилятор пришел к этой оценке. Фактически, первый используется, и он правильный.

+0

[ссылка говорит + имеет более высокий приоритет, а затем <<] (http://en.cppreference.com/w/cpp/language/operator_precedence) запомнить '+' является математическим оператор, тогда как << побитовый оператор, который появляется в программировании. –

+0

Составители не имеют никакого смысла, они просто компилируют –

+0

в дополнение к ответу Дэвида/и моему первому комментарию, например: на любом языке программирования вы не можете найти, что '+' имеет более высокий приоритет перед '*' компилятором multiply, который не нарушает правила. –

ответ

6

«Делает смысл» субъективно. Именно поэтому компиляторы не оценивают «смысл», а грамматику, основанную на наборе правил. Becuase << имеет более высокий приоритет (который задается теми, набор правил), он вычисляет выражение как

a << (b + c) << d 

В случае сомнений, использование круглых скобках.

+1

О, моя дорогая. Как-то я пропустил тот факт, что это также справедливо. Это просто '(a << (b + c)) << d'. Благодарю. –

+3

@ Luchian У вас это перепутано. '+' имеет более высокий приоритет. –

2

Составители не имеют для себя ответственности за то, что имеет смысл. Они просто следуют правилам.

Это разработчики языков, которые делают правила, и они обычно пытаются сделать эти правила так, чтобы они имели смысл. Конечно, то, что кажется разумным для одного человека, кажется странным для другого. Этого практически нет.

1

operator << имеет более низкий приоритет, чем operator +. См. wikipedia.

Составители не пытаются понять, если что-то имеет смысл. Они просто следуют правилам грамматики. Чтобы действительно знать, почему сдвинутые левые получили более низкий приоритет, чем плюс, вы должны, вероятно, спросить призрака Денниса Ричи.

Кроме того, если грамматика хотела предоставить приоритеты по своему усмотрению, она должна была сделать сдвиг влево и плюс с той же приоритетом (и ассоциацией слева направо).

Однако, если вы думаете о таком прецеденте:

unsigned int a, b, mid; 
... 
mid = a + b >> 1; 

то вполне имеет смысл рассчитывать a + b в первую очередь. Поэтому я думаю, что первоначально, когда C был разработан, они решили, что переход происходит после общей математической арифметики.


В C++ это даже делает вещи более удобными. Как сейчас, вы можете написать:

cout << a + b << endl; 

без круглых скобок. Хотя это просто счастливое совпадение и не было бы ничего с первоначальной причиной этих приоритетов.

0

В этом случае компилятор ищет оператора с наивысшим приоритетом и вычисляет соответствующую операцию. Он достигает + и суммы b & c. Затем остается два оператора < <, и их компилятор последовательно обрабатывает их

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