Операционная система UNIX. Руководство программиста

       

Многократные использования и побочные эффекты


Для сложных выражений наилучшая последовательность обработки подвыражений может быть существенно машинно-зависимой. Например, если стек растет в сторону уменьшения адресов, целесообразно обрабатывать аргументы функций справа налево. Там же, где стек растет в сторону увеличения адресов, предпочтительным кажется обратный порядок обработки аргументов. Далее, вызовы функций, указанные в качестве фактических аргументов других функций, могут либо считаться обычными аргументами, либо обрабатываться особым образом. Аналогичные проблемы связаны и с другими операциями, имеющими побочный эффект, такими как операции присваивания, увеличения и уменьшения.

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

lint проверяет важный частный случай - манипуляции со скалярными переменными. Например, оператор

a [i] = b [i++];

вызовет следующее сообщение lint'а:

warning: i evaluation order undefined

Оно должно обратить внимание программиста на то, что порядок, в котором будут производиться действия над переменной i, не определен.



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