как правильно if (someVariable < 50) или if (someVariable <= 49)
- Войдите на сайт для отправки комментариев
Втр, 21/02/2017 - 22:37
Дцать лет назад кто-то дал совет, не использовать в управляющих операторах "открытые" операторы сравнения. Т.е. никогда не писать < 50 при инкрименте, а всегда писать указывая четкие границы <=49. Это было связано с выполнением лишних циклов обработки условия. Типа по последниму условию не больше 49, а условие проверяется еше раз 49+1 и только после этого ничего неделая выходим из цикла (к примеру). Может компиляторы стали "умнее"????
ЗЫ понимаю, что это несушественная мелочь для моих кодов (г****кодов), простой спортивный интерес. Заранее спасибо! :)
Всё зависит от системы команд конкретного процессора. Не знаю на чём писал тот человек, что Вам это посоветовал. Здесь пишите как хотите и не парьтесь.
Ещё зависит от типа someVariable: int или float (например).
Никогда не парюсь на этот счет, потому что это экономия "на спичках" (еще неизвестно, будет ли экономия), ошибки могут встать дороже. Потому если, например, в системе 50 элементов, то и сравниваю я всегда с 50, а не с 49. IMHO, разумеется, если кто-то делает по-другому - ради Бога.
Да, и еще маленькое дополнение. Никогда на сравнивайте так числа типа double.
Например:
double a1=50.0/2.0;
if (a1<25.0) ...
необходимо из a1 вычесть 25.0 и сравнивать с нулем.
Так необходимо делать из за ошибок округления. Округление зависит от версии компилятора и может меняться. По крайней мере в Си. Сам я так не накалывался, но знакомые программисты говорили.
например a1 в данном случае может быть равен либо 24.999999999999999999999 либо 25.0000000000000000000000 либо 25.00000000000000000000000001 и результат сравнения будет разным.
Buldakov, на равенство, действительно сравнивать нельзя, а на больше/меньше - нет никаких противопоказаний.
В приведенном Вами примере 25.00...01 и 25.00...00 - это разные числа и результат их сравнения будет совершенно закономерным.
А вот вычесть одно из другого и сравнивать с 0 - это абсурд. Дополнительная операция в лучшем случае ничего не изменит, а в худшем - внесет дополнительную погрешность за счет ошибки округления.
Единственное, где имеет смысл делать вычитание, это сравнение с заданной точностью, но при этом мы после вычитания во-первых, берем абсолютную величину, а во-вторых - сравниваем не с 0, а с малой величиной эпсилон. Тогда если разница меньше эпсилон, считается, что числа равны. Но это именно сравнение на равенство, а не на больше/меньше.