Язык С

       

Выражения


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

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


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

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

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

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

    () [] . ->

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

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

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

    Бинарные операции: * / % + - >> << < > <= >= == != & \^ \! && \!\! ?:

    Все операции присваивания имеют одинаковый приоритет и груп- пируются справа налево. Операции присваивания: = += -= *= ?= %= >>= <<= &= \^= \!=

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



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