Я только что наткнулся на эту строку кода:
if( lineDirection.length2() ){...}
, где length2 возвращает double. Меня как-то удивляет, что 0.0 эквивалентно 0, NULL и / или false.
length2
double
NULL
false
Это часть стандарта C ++ или неопределенное поведение?
Это очень стандартное поведение (логическое преобразование)
$ 4.12 / 1 - "r-значение арифметики, перечисления, указателя или указателя на тип элемента может быть преобразовано в r-значение типаbool. Нулевое значение, значение нулевого указателя или значение указателя нулевого элемента преобразуется в false; любое другое значение преобразуется в true. "
Стоит отметить, что этот код чрезвычайно хрупок для представлений с плавающей точкой.Этот код будет работать тогда и только тогда, когда значение с плавающей точкой равно 0, что в большинстве случаев маловероятно.Это не может быть в данном конкретном случае, но, безусловно, это должно быть документировано / прокомментировано, если так.диапазон чисел с плавающей запятой, который вы считаете «одинаковым» - иначе ваши сравнения очень вероятно удивят вас в угловых (и часто не очень) случаях.
Да - сравнение против нуля (0.0) и возвращает false, если результат точно равен нулю, и true в противном случае.
Поведение наследуется от C, что аналогично обрабатывает эквивалентное сравнение.
Если length2 вернет 0.0, оно будет принято как false.Но вы можете получить удивительный результат с этим сравнением.Лучше использовать значение epsilon, как предложено MadKeithV при сравнении с плавающей запятой.
Когда вы сравниваете без операторов, вы сравниваете «с истинным», так что каждый тип переменной проверяется на логическое значение (простой случай) или другое. Числовые типы переменных имеют свои ложные значения, определенные как «0», «0.0» или около того, поэтому, когда вы сравниваете их «с истинным», ваше сравнение будет возвращать ложное.