C++Builder — очень умная система. Она успешно распознает подобные ситуации и не будет выполнять лишних действий, экономя время работы. Но при этом возникает потенциальная опасность так называемых побочных эффектов.
Если программист напишет выражение
RateValue > 0 && RateValue <= 100 && ChangeRate(RateValue)
где ChangeRate () — некая условная функция, увеличивающая значение переменной RateValue на единицу, а значение RateValue к моменту вычисления данного выражения будет равно 110, то программа вычислит промежуточное значение
false && ChangeRate(RateValue)
и поймет, что дальше ничего делать не надо — все равно false && что-угодно будет равно false. В итоге программа не вызовет функцию ChangeRate (). А между тем разработчик рассчитывал, что в данном месте значение RateValueQ увеличится на единицу. Однако ничего подобного не произойдет. Поэтому составлять логические выражения надо очень внимательно.
Избегайте использования техники побочных эффектов в своих программах. Эти эффекты — следствие невозможности однозначной и четкой трактовки логики работы различных конструкций Си++, что часто приводит к трудно выявляемым ошибкам.
Создаем фильтр
Теперь мы можем добавить в свою программу фильтр для проверки вводимых значений на их «нормальность». Перейдите к тексту, описывающему реакцию калькулятора на нажатие кнопки пересчета из рублей в доллары, перед вычислением значения Result вставьте условный оператор
if( RateValue > 0 &&
RateValue <= 100 && RoublesNum >= 0 && RoublesNum < 100000 )
(для наглядности его лучше записать в несколько строк), а операторы вычисления Result и вывода значения в поле Dollars надо выделить в логический блок:
115