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



Старшинство и порядок вычисления


В приводимой ниже таблице сведены правила старшинства и ассоциативности всех операций, включая и те, которые мы еще не обсуждали. Операции, расположенные в одной строке, имеют один и тот же уровень старшинства; строки расположены в порядке убывания старшинства. Так, например, операции *, / и % имеют одинаковый уровень старшинства, который выше, чем уровень операций + и -.

Таблица 2.3.

OPERATORASSOCIATIVITY
() [] -> .LEFT TO RIGHT
! \^ ++ -- - (TYPE) * & SIZEOFRIGHT TO LEFT
* / % LEFT TO RIGHT
+ - LEFT TO RIGHT
<< >>LEFT TO RIGHT
< <= > >=LEFT TO RIGHT
== != LEFT TO RIGHT
& LEFT TO RIGHT
^LEFT TO RIGHT
|LEFT TO RIGHT
&& LEFT TO RIGHT
||LEFT TO RIGHT
?:RIGHT TO LEFT
= += -= ETC. RIGHT TO LEFT
, (CHAPTER 3)LEFT TO RIGHT

Операции -> и . Используются для доступа к элементам структур; они будут описаны в лекции №6 вместе с sizeof (размер объекта). В лекции №5 обсуждаются операции * (косвенная адресация) и & (адрес ). Отметим, что уровень старшинства побитовых логических операций &, ^ и э ниже уровня операций == и !=. Это приводит к тому, что осуществляющие побитовую проверку выражения, подобные

if ((x & mask) == 0) ...

Для получения правильных результатов должны заключаться в круглые скобки.

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

В языке "C", как и в большинстве языков, не фиксируется порядок вычисления операндов в операторе. Например в операторе вида

x = f() + g();

сначала может быть вычислено f, а потом g, и наоборот; поэтому, если либо f, либо g изменяют внешнюю переменную, от которой зависит другой операнд, то значение x может зависеть от порядка вычислений. Для обеспечения нужной последовательности промежуточные результаты можно опять запоминать во временных переменных.

Подобным же образом не фиксируется порядок вычисления аргументов функции, так что оператор




Содержание  Назад  Вперед