Оптимизация подвыражений
Если выражение содержит два или более идентичных подвыражения, то вполне достаточно вычислять значение лишь одного из них.
Рассмотрим следующий пример:
if ((a*b)>0x666 && (a*b)<0xDDD) …
Присвоив результат вычисления (a*b) промежуточной переменной, мы сможем избавиться от одной операции умножения, смотрите:
tmp=a*b;
if (tmp>0x666 && tmp<0xDDD) …
Оптимизировать выражения умеют все три рассматриваемых компилятора, но не каждый из них способен распознавать идентичность выражений при их перегруппировке. Вот, например:
if ((a*b)>0x666 && (b*a)<0xDDD) …
Очевидно, что от перестановки множителей произведение не меняется и (a*b) равно (b*a). Компиляторы Microsoft Visual C++ и WATCOM вычислят значение (a*b) лишь однажды, а Borland C++ примет (a*b) и (b*a) за разные
выражения со всеми вытекающими отсюда последствиями.