Многократные использования и побочные эффекты
Для сложных выражений наилучшая последовательность обработки подвыражений может быть существенно машинно-зависимой. Например, если стек растет в сторону уменьшения адресов, целесообразно обрабатывать аргументы функций справа налево. Там же, где стек растет в сторону увеличения адресов, предпочтительным кажется обратный порядок обработки аргументов. Далее, вызовы функций, указанные в качестве фактических аргументов других функций, могут либо считаться обычными аргументами, либо обрабатываться особым образом. Аналогичные проблемы связаны и с другими операциями, имеющими побочный эффект, такими как операции присваивания, увеличения и уменьшения.
Чтобы не жертвовать сверх меры эффективностью реализации языка C на конкретной машине, оговаривается, что компилятор волен выбирать порядок вычисления сложных выражений. И многие компиляторы этим правом пользуются. В частности, если какая-либо переменная изменяется вследствие побочного эффекта и, кроме того, используется в этом выражении еще раз, результат, вообще говоря, не определен.
lint проверяет важный частный случай - манипуляции со скалярными переменными. Например, оператор
a [i] = b [i++];
вызовет следующее сообщение lint'а:
warning: i evaluation order undefined
Оно должно обратить внимание программиста на то, что порядок, в котором будут производиться действия над переменной i, не определен.