Порядок выполнения операций c++
Primary tabs
17 :: контекст
16 -> операция непрямого доступа к членам класса
16 . операция точки (доступ к полю)
16 [] индекс массива
16 () вызов функции
15 ++ -- инкремент и декремент
15 ~ поразрядное НЕ
15 ! логическое НЕ
15 - унарный минус
15 * операция разыменования
15 new delete выделение памяти из кучи
14 .* доступ к указателю-члену
13 * / % умножение, деление и взятие остатка
12 + - сложение и вычитание
11 >>
10 > >=
9 == != операции проверки на равенство
8 & поразрядное И
7 ^ поразрядное исключающее ИЛИ
6 | поразрядное ИЛИ
5 && логическое И
4 || логическое ИЛИ
3 ?: условная операция
2 = *= /= %= += -= операции присваивания
2 >= поразрядные операции сдвига с присваиванием
2 &= |= ^= поразрядные логическоие операции с присваиванием
1 , запятая
взял отсюда = http://shatalov.su/ru/articles/cpp_prime...
далее подробнее
Чем ниже блок по тексту далее, тем приоритет операции ниже разбиты на блоки - в рамках одного блока приоритет одинаковый - и порядок вычислений определяется видом ассоциированности.(справедливо для си++ версия для Си здесь):
-----Блок № 1------------------------
разрешение области видимости class-name :: member
разрешение области видимости namespace-name :: member
глобально :: name
глобально :: qualified-name
-----Блок №2 ------------------------
- выбор члена object. member
- выбор члена pointer -> member
- доступ по индексу
- вызов функции
- конструирование значения
- постфиксный инкремент
- постфиксный декремент
- идентификация типа
- идентификация типа во время выполнения
- преобразование с проверкой во время выполнения
- преобразование с проверкой во время компиляции
- преобразование без проверки
- константное преобразование
им по номерам соответствуют:
- object. member
- pointer -> member
- pointer [ expr ]
- expr[ expr-list)
- type {expr-list)
- value ++
- value --
- typeid{type)
- typeid (expr)
- dynamic cast ( expr}
- static_cast ( expr)
- reinterpret_cast ( expr j
- const_cast ( expr)
-----Блок №3 ------------------------
- размер объекта
- размер типа
- префиксный инкремент
- префиксный декремент
- дополнение
- отрицание
- унарный минус
- унарный плюс
- адрес
- разыменование
- создать (выделить память)
- создать (выделить память и инициализировать)
- создать (разместить)
- создать (разместить и инициализировать)
- уничтожить (освободить память)
- уничтожить массив
- приведение (преобразование типа)
им по номерам соответствуют:
- sizeofexpr
- sizeof{ type)
- ++ lvalue
- - lvalue
- - lvalue
- I expr
- - expr
- + expr
- & lvalue
- * expr
- new type
- new type (expr-list)
- new (expr-list) type
- new ( expr-list) type ( expr-list
- delete pointer
- delete[] pointer
- (type ) expr
-----Блок №3 ------------------------
- выбор члена object * pointer-to-member
- выбор члена pointer —>* pointer-to-member
-----Блок №4 ------------------------
- умножение expr * expr
- деление expr / expr
- остаток от деления (деление по модулю) expr%expr
-----Блок №5------------------------
- сложение (плюс) +
- вычитание (минус) -
-----Блок №6 ------------------------
- сдвиг влево a
- сдвиг вправо b>>a
-----Блок №7------------------------
- меньше
- меньше или равно
- больше
- больше или равно
им соответствуют:
- expr
- expr
- expr > expr
- expr >= expr
-----Блок №8------------------------
- равно
- не равно
т.е =
- expr == expr
- expr != expr
-----Блок № 9------------------------
- побитовое И (AND) expr & expr
-----Блок №10 ------------------------
- побитовое исключающее ИЛИ (OR) expr ^ expr
-----Блок №11 ------------------------
- побитовое ИЛИ (OR) expr!expr
-----Блок №12 ------------------------
- логическое И (AND) expr && expr
-----Блок №13 ------------------------
- логическое ИЛИ (OR) expr |i expr
-----Блок № 14------------------------
- условное выражение expr ? expr: expr
-----Блок №15 ------------------------
- простое присваивание value = expr
- умножение и присваивание value *= expr
- деление и присваивание value /= expr
- остаток и присваивание value %= expr
- сложение и присваивание value += expr
- вычитание и присваивание value -= expr
- сдвиг влево и присваивание value «= expr
- сдвиг вправо п присваивание value »= expr
- И и присваивание value &= expr
- ИЛИ и присваивание value |= expr
- исключающее ИЛИ и присваивание value ^= expr
-----Блок № 16 ------------------------
генерация исключения throw expr
-----Блок № 17------------------------
запятая (последовательность) expr, expr
----- ------------------------
- умножение expr * expr
- деление expr / expr
- остаток от деления (деление по модулю) expr%expr
В каждом блоке расположены операторы с одинаковым приоритетом. Операторы
в блоке, расположенном выше, имеют более высокий приоритет. Например: а+Ь*с означает а+(Ь*с), а не (а+Ь)*с, потому что * имеет более высокий приоритет, чем +.
Унарные операторы и операторы присваивания правоассоциативны - то есть сначала вычисляется результат справа, а все осталь-
ные левоассоциативны. Например, а=Ь=с означает а=(Ь=с) - то "=" - правоассоциативный оператор
в то время как =
a+b+с означает (а+Ь)+с следовательно "+" - левоассоциативный оператор.
Несколько грамматических правил нельзя выразить в терминах приоритетов (на-
зываемых также силой связывания) и ассоциативности.
Например=
a=b<c ? d=e :f=g;
означает
а=((Ь<с) ? (d=e): (f=g))
но для того чтобы об этом догадаться, нужно обратиться
к правилам грамматики (§ А.5).
Перед использованием грамматических правил из символов составляются лексические обозначения (лексемы, § А.З). Для получения каждой лексемы выбирается самая длинная из возможных последовательностей символов.
- Log in to post comments
- 5325 reads