2015-02-09 2 views
2

Привет, ребята, после прохождения href = http://en.cppreference.com/w/c/language/operator_precedence эта ссылка, Я думал, что понял приоритет оператора, но я пришел к следующим сомнениям. Ссылка говорит, что При анализе выражения оператор, который указан в некоторой строке, будет привязан к его аргументам более жестко (как если бы они были скопированы), чем любой оператор, который указан ниже в строке. Например, выражение * p ++ анализируется как * (p ++), а не как (* p) ++.
Итак, как оценивается выражение ++ * p, это как ++ (* p), но если yes ++ имеет более высокий приоритет или привязанный, то *, то почему же в этой ситуации происходит более жесткое * и что о выражении * ++ p?Приоритет оператора Confusion

+2

Для '++ * p', как бы вы поместили круглые скобки другим способом? '++' обязательно должен применяться к '* p', а не' p', потому что он физически помещен слева от '* p', а не' p'. Когда вы пишете '1 + 2 * 3', вы не ожидаете, что 1 и 2 умножатся, даже если' * 'связывается более жестко, чем' + '. –

+0

Отвечая на ваш второй вопрос, '* ++ p' эквивалентен' * (++ p) '. Здесь также нет никакой двусмысленности, которая потребует обращения к приоритету оператора для разрешения. –

+0

'* ++ p' должен интерпретироваться как' * (++ p) 'потому что' (* ++) p' не имеет смысла - операнд '*' должен быть значением, а не оператор. –

ответ

3

Оператор приоритет определяет, какой оператор следует применять сначала при наличии более одного выбора.

Из Вашей ссылки:

Старшинство и ассоциативность независимы от order of evaluation.

Выражение ++*p или любое выражение вида:

{operator 2} {operator 1} {expression} 

имеет четко определенный order of evaluation, где {operator 1} {expression}должны быть применены для того, чтобы выражение, которое {operator 2} может действовать на.

1

Да ++ имеет более высокий приоритет над *, а ассоциативность для обоих - справа налево.

Так

++*p будет оцениваться как ++(*p), потому что ++ должны быть применены на модифицируемые значения.

В то время как

*++p, как вы видите, когда это оценивается оператор, близкий к p является ++, а также имеют более высокий приоритет над * так ++p будет происходить первым последующим разыменования *(++p)