C++Builder — очень умная система. Она успешно распознает подобные ситуации и не будет выполнять лишних действий, экономя время работы. Но при этом возникает потенциальная опасность так называемых побочных эффектов.

Если программист напишет выражение

RateValue > 0 && RateValue <= 100 && ChangeRate(RateValue)

где ChangeRate () — некая условная функция, увеличивающая значение переменной RateValue на единицу, а значение RateValue к моменту вычисления данного выражения будет равно 110, то программа вычислит промежуточное значение

false && ChangeRate(RateValue)

и поймет, что дальше ничего делать не надо — все равно false && что-угодно будет равно false. В итоге программа не вызовет функцию ChangeRate (). А между тем разработчик рассчитывал, что в данном месте значение RateValueQ увеличится на единицу. Однако ничего подобного не произойдет. Поэтому составлять логические выражения надо очень внимательно.

h01151.jpg

Избегайте использования техники побочных эффектов в своих программах. Эти эффекты — следствие невозможности однозначной и четкой трактовки логики работы различных конструкций Си++, что часто приводит к трудно выявляемым ошибкам.

Создаем фильтр

Теперь мы можем добавить в свою программу фильтр для проверки вводимых значений на их «нормальность». Перейдите к тексту, описывающему реакцию калькулятора на нажатие кнопки пересчета из рублей в доллары, перед вычислением значения Result вставьте условный оператор

if( RateValue > 0 &&

RateValue <= 100 && RoublesNum >= 0 && RoublesNum < 100000 )

(для наглядности его лучше записать в несколько строк), а операторы вычисления Result и вывода значения в поле Dollars надо выделить в логический блок:

115