Определение языка C не так однозначно в отношении инфикса, префикса и постфикса; термины «префикс» и «инфикс» даже не появляются в определении языка как такового. Вместо этого у вас есть бинарные операторные выражения (сортировка с инфиксом) и унарные выражения (сортировка с префиксом). Кроме того, группировки выражений в постфиксные, унарные и двоичные категории имеют больше общего с тем, какие выражения должны иметь более высокий приоритет, чем другие, а не там, где операторы появляются в выражении.
Например, операторы &&
и ||
выглядят так, как будто они должны быть сгруппированы с выражениями бинарных операторов, но это не так; они занимают свое собственное пространство в грамматике языка и имеют свою уникальную семантику. Операторы выбора компонентов .
и ->
сгруппированы с операторами постфикса, даже если они появляются между двумя выражениями, потому что выбор компонента всегда должен иметь более высокий приоритет, чем, скажем, косвенное обращение к адресу (т. Е. &a.b
всегда должен анализироваться как &(a.b)
, а не (&a).b
), а также потому, что правый операнд всегда должен быть идентификатором.
Постфиксные выражения включают следующее:
- Первичные выражения (имена переменных, литералы, выражения в скобках)
- Выражение индекса массива (
a[i]
)
- Выбор компонентов (
a->b
, d.c
)
- Функциональные вызовы (
foo(a,b)
)
- Выражение приращения и уменьшения (
a++
, b--
)
- Литералы Compount (только C99 -
(int []) {1, 2, 3}
)
Все постфиксные выражения имеют более высокий приоритет, чем унарные или двоичные выражения.
Унарные выражения включают следующее:
- Постфиксные выражения
- Литые выражения (
(int) foo
)
- Размер выражений (
sizeof foo
, sizeof (int)
)
- Унарный минус (
-5
)
- Унарный плюс (
+1
)
- Логическое отрицание (
!expr
)
- Побитовое отрицание (
~byte
)
- адресное выражение (
&foo
)
- Выражение косвенного обращения (
*ptr
)
- Предварительное увеличение и уменьшение (
++foo
, --bar
)
Унарные выражения имеют более высокий приоритет, чем двоичные выражения, но имеют более низкий приоритет, чем выражения с постфиксным выражением.
Двоичные выражения включают следующее:
- Мультипликативные выражения (
a * b
, c / d
)
- Аддитивные выражения (
a + b
, c - d
)
- Выражения сдвига (
a << b
, val >> 2
)
- Реляционные выражения (
a < b
, c >= d
)
- Выражения равенства (
a == b
, c != d
)
- Битовые выражения (
a & b
, c | d
, e ^ f
)
Двоичные выражения имеют более низкий приоритет, чем постфиксные и унарные выражения.
В дополнение к этим группам у вас также есть выражения логических операторов (&&
и ||
), условные выражения (a ? b : c
), которые имеют более низкий приоритет, чем двоичные выражения, выражения присваивания (a = b
, c += d
), последовательные выражения (a, b, c
) и константные выражения (int a[42]
, case 5:
), которые отличаются от литералов, классифицированных с постфиксными выражениями.