приоритет оператора над + и ++ [дубликаты]

0

Учитывая следующий код:

 int  a=0,b=1;
 int r=a+++b;

какие операции выполняются и в каком порядке?

   a++ + b
   a + ++b

Я этот компилятор специфичен или зависит от стандарта?

  • 2
    Избегайте подобных утверждений, если это вообще возможно
  • 2
    Всегда можно избежать подобных патологических случаев. Когда не очевидно, что это значит для человека, вы должны использовать другие конструкции, чтобы прояснить смысл (например, скобки и пробел). То, что компилятор может интерпретировать это, не означает, что мы хотим, чтобы люди когда-либо пытались это сделать.
Показать ещё 1 комментарий
Теги:
operators
lexer
operator-precedence

2 ответа

4
Лучший ответ

Это (a++) + b но не из-за приоритета оператора.

Он анализируется как (a++) + b потому что компилятор принимает самый длинный токен, который он может использовать из последовательности символов. Другими словами, лексер продолжает читать символы, пока не встретит что-то, что не может быть частью того же токена, что и у него.

Это также то, как он интерпретирует >= как один токен вместо > и = и double как "double", а не " do uble".

Существуют правила приоритетности операторов для таких операторов, как

a || b && c
// "a || (b && c)" NOT "(a || b) && c", because && takes precedence

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

Есть несколько хороших ответов на вопрос: почему a++ +++ b не работает в C? что должно объяснить это более подробно.

  • 0
    Я бы перефразировал второе предложение. It is parsed as a ++ + b because ... Там нет ( или ) в оригинале, поэтому вы не хотите добавлять их в данный момент. Вы можете (и должны) использовать при объяснении, как оценивается выражение (первое предложение). Примечание: компилятор не всегда берет самый длинный токен (помните всю проблему вокруг >> с шаблонами).
  • 0
    Я действительно имел в виду «именно так», поэтому я сохранил синтаксис «этого» таким же, как и в предыдущем предложении. Я чувствую, что это X. Это Y, потому что ... больше сбивает с толку, чем X. Это X потому что ... Что касается >> в шаблонах, то причина в том, что это проблема, из-за взятия самого длинного маркер: лексер получает >> когда должно быть два > с.
1

Это определяется приоритетом оператора. Так как postfix ++ имеет более высокий приоритет, чем оператор +, он связывает более строгие с a, а post добавляется в b, поэтому результат:

(a++) + b
  • 5
    не правда порядок выполнения определяется приоритетом оператора. но в этот момент у вас уже есть операторы. см. stackoverflow.com/questions/7485088/…
  • 2
    @ user3283017 Как уже отмечалось, этот ответ неверен. Пожалуйста, не могли бы вы пометить его как принятый и принять правильный ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню