Frage

Ich lief in dieser Codezeile:

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

wo length2 eine double zurückgibt. Es Art von Rätseln mir, dass 0,0 entspricht 0, NULL und / oder false.

Ist dieser Teil der C ++ Standard oder ist es nicht definiertes Verhalten?

War es hilfreich?

Lösung

Es ist ein sehr viel Standard-Verhalten (Boolean Conversion)

$ 4.12 / 1 - „Ein R-Wert der Arithmetik, Enumeration, Zeiger oder Pointer auf Elementtyp kann eine umgewandelte sein rvalue vom Typ Bool. Ein Nullwert, Null-Zeiger-Wert oder null Mitglied Zeigerwert wird auf false umgewandelt; jeder andere Wert auf true umgewandelt. "

Andere Tipps

Es ist erwähnenswert, dass dieser Code extrem spröde ist für Gleitkommadarstellungen. Dieser Code wird funktionieren, wenn und nur wenn der Gleitkommawert ist genau 0, was in den meisten Fällen tatsächlich ziemlich unwahrscheinlich ist. Es kann nicht in diesem speziellen Fall sein, aber es sollte auf jeden Fall zu dokumentieren / kommentierte wenn ja.

In praktisch allen anderen Situationen müssen Sie auf einer "epsilon entscheiden, Wert ", dass der Bereich von Gleitkommazahlen definiert man bedenkt,‚the same‘- sonst Ihre Vergleiche sind sehr wahrscheinlich überraschen Sie in der Ecke (und oft auch nicht-so-Ecke) Fälle

.

Ja -. Der Vergleich gegen Null (0,0) und kehrt falsch, wenn das Ergebnis genau Null ist, und ansonsten true

Das Verhalten von C geerbt, die dem äquivalent Vergleich behandelt die gleiche Weise.

Wenn Sie ohne Operatoren vergleichen, die Sie vergleichen „gegen true“, so dass jeder Variablentyp geprüft wird entweder boolean (einfacher Fall) oder eine andere zu sein. Numerische Variablen-Typen haben ihren falschen Wert als „0“, „0.0“ oder so, also, wenn man sie vergleichen „gegen true“, Ihr Vergleich wird return false.

Wenn length2 kehrt 0.0 wird es als falsch eingenommen werden. Aber Sie könnten überraschendes Ergebnis mit diesem Vergleich zu erhalten. Bessere Nutzung Epsilon-Wert als MadKeithV vorgeschlagen während Gleitkomma-Vergleich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top