Язык программирования C

       

Выражения


Основными выражениями являются следующие:

выражение: первичное-выражение * выражение & выражение - выражение ! Выражение \^ выражение ++ l-значение -- l-значение l-значение ++ l-значение --

sizeof выражение (имя типа) выражение выражение бинарная-операция выражение выражение ? Выражение : выражение l-значение операция-присваивания выражение выражение , выражение первичное выражение: идентификатор константа строка (выражение) первичное-выражение (список выражений необ) первичное-выражение [выражение] l-значение . Идентификатор первичное выражение -> идентификатор l-значение: идентификатор первичное-выражение [выражение] l-значение . Идентификатор первичное-выражение -> идентификатор * выражение (l-значение)

Операции первичных выражений

() [] . ->

имеют самый высокий приоритет и группируются слева направо. Унарные операции

* & - ! \^ ++ -- sizeof(Имя типа)

имеют более низкий приоритет, чем операции первичных выражений, но более высокий, чем приоритет любой бинарной операции. Эти операции группируются справа налево. Все бинарные операции и условная операция (прим. перевод.: условная операция группируется справа налево; это изменение внесено в язык в 1978 г.) группируются слева направо и их приоритет убывает в следующем порядке:

Бинарные операции:

  • * / %
  • + -
  • >> <<
  • < > <= >=
  • == !=
  • &
  • \^
  • |
  • &&
  • ||
  • ?:

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

= += -= *= ?= %= >>= <<= &= \^= |=

Операция запятая имеет самый низкий приоритет и группируется слева направо.


Старшинство операций в выражениях совпадает с порядком следования основных подразделов настоящего раздела, начиная с самого высокого уровня старшинства. Так, например, выражениями, указываемыми в качестве операндов операции +, являются выражения, определеные в разделах ниже. Внутри каждого подраздела операции имеет одинаковое старшинство. В каждом подразделе для описываемых там операций указывается их ассоциативность слева или справа. Старшинство и ассоциативность всех операций в выражениях резюмируются в грамматической сводке, расположенной ниже.

В противном случае порядок вычислений выражений не определен. В частности, компилятор считает себя в праве вычислять подвыражения в том порядке, который он находит наиболее эффективным, даже если эти подвыражения приводят к побочным эффектам. Порядок, в котором происходят побочные эффекты, не специфицируется. Выражения, включающие коммутативные и ассоциативные операции (*,+,&,!, ^), могут быть переупорядочены произвольным образом даже при наличии круглых скобок; чтобы вынудить определенный порядок вычислений, в этом случае необходимо использовать явные промежуточные переменные.

При вычислении выражений обработка переполнения и проверка при делении являются машинно-зависимыми. Все существующие реализации языка "C" игнорируют переполнение целых; обработка ситуаций при делении на 0 и при всех особых случаях с плавающими числами меняется от машины к машине и обычно выполняется с помощью библиотечной функции.



Содержание раздела