Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Август 09, 2009, 22:46



Название: Полезная строка/inline
Отправлено: Igors от Август 09, 2009, 22:46
Добрый день

Разбирался с чужой программой и нашел строчку

if (!(a >= 0) && !(a < 0)) {
...
}

Это совсем не бессмысленно (как с первого взгляда кажется :-)


Название: Re: Полезная строка/inline
Отправлено: spectre71 от Август 09, 2009, 22:58
Добрый день

Разбирался с чужой программой и нашел строчку

if (!(a >= 0) && !(a < 0)) {
...
}

Это совсем не бессмысленно (как с первого взгляда кажется :-)
Всегда == false =>  бред!


Название: Re: Полезная строка/inline
Отправлено: Hellraiser от Август 09, 2009, 23:11
Абсолютно бессмысленно: блок выполнится только при истинности левой (!(а>=0)) и правой частей (!(a<0)). Применив отрицание, получим левую часть a<0 и правую - a>=0. Какое же значение для одновременного выполнения условий может принимать а, если вся область чисел рассмотрена?


Название: Re: Полезная строка/inline
Отправлено: f-r-o-s-t от Август 09, 2009, 23:17
Наверное все просто и там внутри просто написан код, который никогда не должен выполняться =)


Название: Re: Полезная строка/inline
Отправлено: BlackTass от Август 09, 2009, 23:35
Еще есть вариант что архитектуру разрабатывал человек с неустойчивой психикой и a является экземпляром класса, в котором переопредлены операторы >= и < таким образом, что данное условие в некоторых случаях может выполняться  ;)


Название: Re: Полезная строка/inline
Отправлено: Igors от Август 09, 2009, 23:36
Абсолютно бессмысленно: блок выполнится только при истинности левой (!(а>=0)) и правой частей (!(a<0)). Применив отрицание, получим левую часть a<0 и правую - a>=0. Какое же значение для одновременного выполнения условий может принимать а, если вся область чисел рассмотрена?
В том-то и дело, что не вся  :)


Название: Re: Полезная строка/inline
Отправлено: Igors от Август 09, 2009, 23:44
Еще есть вариант что архитектуру разрабатывал человек с неустойчивой психикой и a является экземпляром класса, в котором переопредлены операторы >= и < таким образом, что данное условие в некоторых случаях может выполняться  ;)

- никаких классов/перегрузок нет.

- писал болгарин, очень сильный программер

- работает на любой платформе и размер в 10 раз меньше чем делать то же по-другому (как, кстати было сделано у меня  ;))


Название: Re: Полезная строка/inline
Отправлено: spectre71 от Август 10, 2009, 00:05
- никаких классов/перегрузок нет.
- писал болгарин, очень сильный программер
- работает на любой платформе и размер в 10 раз меньше чем делать то же по-другому (как, кстати было сделано у меня  ;))
Да... :D :D :D
Особенно прикольно про любую платформу.


Название: Re: Полезная строка/inline
Отправлено: lit-uriy от Август 10, 2009, 08:36
Если к записи:
!(a >= 0) && !(a < 0)
применить правило деМоргана, то получим:
!((a >= 0) || (a < 0))

(в некоторых случаях может быть нагляднее)

Но смысла записи я всё-равно не понял


Название: Re: Полезная строка/inline
Отправлено: Tonal от Август 10, 2009, 10:14
Тип a не float || double часом? :)


Название: Re: Полезная строка/inline
Отправлено: Igors от Август 10, 2009, 16:36
Тип a не float || double часом? :)
Да


Название: Re: Полезная строка/inline
Отправлено: Alex Custov от Август 11, 2009, 01:41
проверка на -0 штоле?

Доп. Хотя нет, -0 == 0, так что (a >= 0) вернет true...


Название: Re: Полезная строка/inline
Отправлено: Tonal от Август 11, 2009, 11:14
Хороший приём. :)


Название: Re: Полезная строка/inline
Отправлено: spectre71 от Август 11, 2009, 11:30
Хороший приём. :)
Для любого a имеющего тип объекты которого принадлежат упорядоченному множеству и операции "<" , ">" "==", ..., правильно определены для данного типа, данное выражение ВСЕГДА false.
Соответственно, для любого значения float и double - ВСЕГДА false.
Так что ничего полезного в нем нет!
Над вами просто прикололись!


Название: Re: Полезная строка/inline
Отправлено: SASA от Август 11, 2009, 11:33
проверка на -0 штоле?
Можно по подробнее.


Название: Re: Полезная строка/inline
Отправлено: Alex Custov от Август 11, 2009, 11:50
проверка на -0 штоле?
Можно по подробнее.

http://ru.wikipedia.org/wiki/Машинный_ноль


Название: Re: Полезная строка/inline
Отправлено: Tonal от Август 11, 2009, 12:07
2 Spectre Учи матчасть: Nan (http://ru.wikipedia.org/wiki/Nan)


Название: Re: Полезная строка/inline
Отправлено: Igors от Август 11, 2009, 13:15
Можно по подробнее.
Можно. Пример

double a = sqrt(-1.0);
if (!(a >= 0) && !(a < 0))
    printf("a is invalid");

Условие возвращает true и printf выполняется. На практике это удобный способ проверить "живы ли еще расчеты" (или уже молотим Nan'ы).

Ну а насчет "приколов" - стар я уже чтобы глупыми шутками заниматься  :)


Название: Re: Полезная строка/inline
Отправлено: spectre71 от Август 11, 2009, 13:40
2 Spectre Учи матчасть: Nan (http://ru.wikipedia.org/wiki/Nan)
Век живи век учись. Никогда этим не пользовался и соответственно не знал.
Получается что double(float) не являются упорядоченным множеством :)


Название: Re: Полезная строка/inline
Отправлено: Rcus от Август 11, 2009, 13:56
Условие возвращает true и printf выполняется. На практике это удобный способ проверить "живы ли еще расчеты" (или уже молотим Nan'ы).
Я не слишком знаком с экзотическими платформами, но разве isnan из cmath/math.h не тоже самое делает?


Название: Re: Полезная строка/inline
Отправлено: spectre71 от Август 11, 2009, 14:00
Условие возвращает true и printf выполняется. На практике это удобный способ проверить "живы ли еще расчеты" (или уже молотим Nan'ы).
Я не слишком знаком с экзотическими платформами, но разве isnan из cmath/math.h не тоже самое делает?
Видимо приведенный метод более оптимален.


Название: Re: Полезная строка/inline
Отправлено: Alex Custov от Август 11, 2009, 14:44
2 Spectre Учи матчасть: Nan (http://ru.wikipedia.org/wiki/Nan)

А к чему такие сложности? Можно же сравнить a != a?


Название: Re: Полезная строка/inline
Отправлено: Igors от Август 11, 2009, 15:34
Я не слишком знаком с экзотическими платформами, но разве isnan из cmath/math.h не тоже самое делает?

Я так и делал пока не увидел эту строку  :) Но этого было недостаточно, нужно вызывать fpclassify и проверять варианты. Да еще на др. компиляторе _fpclass (а не fpclassify). В итоге получалось длинно и мутно.

А к чему такие сложности? Можно же сравнить a != a?

Можно, но так мы провоцируем оптимизатор кода. лучше таких приключений не искать.


Название: Re: Полезная строка/inline
Отправлено: spectre71 от Август 11, 2009, 16:22
А к чему такие сложности? Можно же сравнить a != a?

Можно, но так мы провоцируем оптимизатор кода. лучше таких приключений не искать.

Не факт, что какой-нибудь оптимизатор кода не схлопнет (!(a >= 0) && !(a < 0)) до false.


Название: Re: Полезная строка/inline
Отправлено: Igors от Август 11, 2009, 16:40
Не факт, что какой-нибудь оптимизатор кода не схлопнет (!(a >= 0) && !(a < 0)) до false.

Насколько я замечал, даже абсурдные сравнения в оптимизированном коде выполняются. Но вот как сравнивать - вариантов много. Например если "а" float  то для (a != a) вполне могут быть использованы целочисленные 4-байтные регистры (вместо FP). А в общем согласен, конечно - не факт.