25 февраля 2006 г.

Приоритеты операций в Си

Давно искал нечто подобное, чтобы можно было повесить на стенку и пользоваться каждый день. По правде сказать, самому такую табличку сделать было лень. Все-таки, нашелся какой-то добрый человек и сделал эту таблицу, за что спасибо ему огромное. К сожалению, не знаю имени автора, ибо таблица попала ко мне в бумажном варианте. С удовольствием поставлю ссылку на автора, если таковой отыщется.

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

ПриоритетОператорОписание
1++Префиксный инкремент
--Префиксный декремент
()Вызов функции или подвыражение
[]Выделение элемента массива
->Указатель структуры
.Член структуры
2!Логическое отрицание
~Поразрядное логическое НЕ (двоичная инверсия)
-Унарный минус (изменение знака)
+Унарный плюс
(type)Преобразование к типу
*Разыменование указателя
&Определение адреса переменной
sizeofОпределение размера в байтах
3*Умножение
/Деление
%Остаток от деления
4+Сложение
-Вычитание
5>>Поразрядный сдвиг вправо
<<Поразрядный сдвиг влево
6<Меньше
>Больше
<=Меньше или равно
>=Больше или равно
7==Равно
!=Не равно
8&Поразрядное логическое И
9^Поразрядное исключающее ИЛИ
10|Поразрядное логическое ИЛИ
11&&Логическое И
12||Логическое ИЛИ
13?:Оператор условия
14=Присваивание
+=Составное сложение
-=Составное вычитание
*=Составное умножение
/=Составное деление
%=Составное определение остатка от деления
>>=Составной поразрядный сдвиг вправо
<<=Составной поразрядный сдвиг влево
&=Составное поразрядное логическое И
^=Составное поразрядное исключающее ИЛИ
|=Составное поразрядное логическое ИЛИ
15,Операция "запятая"
++Постфиксный инкремент
--Постфиксный декремент

8 комментариев:

  1. Спасибо большое за таблицу! Я в одну книжку по Сям залез - так там в таблице приоритетов все операции были, кроме префиксных и постфиксных декремента и инкремента. А мне нужно было узнать именно о постфиксном инкременте. Пожалуй, самая трудно запоминаемая вещь в Сях - это приоритеты.

    ОтветитьУдалить
  2. Пожалуйста :)
    Только, наверное, не мне спасибо - мне таблица в виде ксерокопии досталась. Сам бы спасибо сказал, только не знаю кому :)

    ОтветитьУдалить
  3. прикольно. але немає операцій new і delete

    ОтветитьУдалить
  4. действительно прикольно, что в Си вообще нет new и delete :)

    ОтветитьУдалить
  5. вот здесь есть абсолютно такая же таблица... наверное отсюда... http://do.rksi.ru/library/courses/demo/tema1_3.dbk

    ОтветитьУдалить
  6. только там еще ассоциативный порядок указан

    ОтветитьУдалить
  7. Да, похоже, что это она и есть. Ассоциативный порядок я просто не стал здесь выписывать.

    ОтветитьУдалить
  8. Необходимость в подобной табличке свидетельствует, что идея с большим числом приоритетов неудачна. Следовательно и использовать эту табличку не стоит, потому что анализ написанного с помощью нее выражения вносит неуверенность в правильность ее понимания, и вынуждает обращаться к внешним источникам памяти. Склоняюсь к мысли, что скобочки экономить не стоит. Компиляторы clang и gcc (-Wall) выдают предупреждение на выражение вида (1 || 1 && 0), хотя по правилам тут все однозначно. Шишек, видимо, было набито немало.

    ОтветитьУдалить