Является ли if (double) допустимым C ++? - PullRequest
8 голосов
/ 22 сентября 2010

Я только что наткнулся на эту строку кода:

if( lineDirection.length2() ){...}

, где length2 возвращает double. Меня как-то удивляет, что 0.0 эквивалентно 0, NULL и / или false.

Это часть стандарта C ++ или неопределенное поведение?

Ответы [ 5 ]

9 голосов
/ 22 сентября 2010

Это очень стандартное поведение (логическое преобразование)

$ 4.12 / 1 - "r-значение арифметики, перечисления, указателя или указателя на тип элемента может быть преобразовано в r-значение типаbool. Нулевое значение, значение нулевого указателя или значение указателя нулевого элемента преобразуется в false; любое другое значение преобразуется в true. "

7 голосов
/ 22 сентября 2010

Стоит отметить, что этот код чрезвычайно хрупок для представлений с плавающей точкой.Этот код будет работать тогда и только тогда, когда значение с плавающей точкой равно 0, что в большинстве случаев маловероятно.Это не может быть в данном конкретном случае, но, безусловно, это должно быть документировано / прокомментировано, если так.диапазон чисел с плавающей запятой, который вы считаете «одинаковым» - иначе ваши сравнения очень вероятно удивят вас в угловых (и часто не очень) случаях.

5 голосов
/ 22 сентября 2010

Да - сравнение против нуля (0.0) и возвращает false, если результат точно равен нулю, и true в противном случае.

Поведение наследуется от C, что аналогично обрабатывает эквивалентное сравнение.

0 голосов
/ 22 сентября 2010

Если length2 вернет 0.0, оно будет принято как false.Но вы можете получить удивительный результат с этим сравнением.Лучше использовать значение epsilon, как предложено MadKeithV при сравнении с плавающей запятой.

0 голосов
/ 22 сентября 2010

Когда вы сравниваете без операторов, вы сравниваете «с истинным», так что каждый тип переменной проверяется на логическое значение (простой случай) или другое. Числовые типы переменных имеют свои ложные значения, определенные как «0», «0.0» или около того, поэтому, когда вы сравниваете их «с истинным», ваше сравнение будет возвращать ложное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...