Ist if (doppelt) gültig C ++?

8

Ich bin gerade in diese Codezeile gelaufen:

%Vor%

wobei length2 eine double zurückgibt. Es verwirrt mich, dass 0.0 0, NULL und / oder false entspricht.

Ist dies ein Teil des C ++ - Standards oder ist das Verhalten nicht definiert?

    
Viktor Sehr 22.09.2010, 07:31
quelle

5 Antworten

9

Es ist ein sehr viel Standardverhalten (boolesche Konvertierung)

  

$ 4.12 / 1 - "Ein rvalue der Arithmetik,   Aufzählung, Zeiger oder Zeiger auf   Mitgliedstyp kann in ein umgewandelt werden   rvalue des Typs bool. Ein Wert von Null,   Nullzeigerwert oder Nullelement   Zeigerwert wird in false konvertiert;   Jeder andere Wert wird in true umgewandelt. "

    
Chubsdad 22.09.2010, 07:44
quelle
7

Es ist erwähnenswert, dass dieser Code für Gleitkommadarstellungen extrem spröde ist. Dieser Code wird genau dann funktionieren, wenn der Fließkommawert genau 0 ist, was in den meisten Fällen ziemlich unwahrscheinlich ist. Es mag nicht in diesem speziellen Fall sein, aber es sollte sicherlich dokumentiert / kommentiert werden, wenn dies der Fall ist.

In praktisch allen anderen Situationen müssen Sie sich für ein "epsilon entscheiden Wert ", der den Bereich der Fließkommazahlen definiert, die Sie als" gleich "betrachten - andernfalls werden Ihre Vergleiche Sie sehr wahrscheinlich in Eckfällen (und oft auch nicht so sehr) überraschen.

    
Joris Timmermans 22.09.2010 07:41
quelle
5

Ja - der Vergleich ist gegen Null (0.0) und gibt false zurück, wenn das Ergebnis genau Null ist, und andernfalls wahr.

Das Verhalten wird von C übernommen, das den äquivalenten Vergleich auf die gleiche Weise behandelt.

    
Jonathan Leffler 22.09.2010 07:34
quelle
0

Wenn Sie ohne Operatoren vergleichen, vergleichen Sie "gegen wahr", so dass jeder Variablentyp entweder als boolesch (einfacher Fall) oder als anderer Typ geprüft wird. Numerische Variablentypen haben ihren falschen Wert als "0", "0.0" oder so definiert. Wenn Sie sie also mit "wahr" vergleichen, gibt Ihr Vergleich den Wert false zurück.

    
Tomasz Kowalczyk 22.09.2010 07:35
quelle
0

Wenn length2 0.0 zurückgibt, wird dies als false interpretiert. Aber Sie könnten mit diesem Vergleich ein überraschendes Ergebnis erzielen. Verwenden Sie besser den Epsilon-Wert, wie MadKeithV beim Gleitkomma-Vergleich vorgeschlagen hat.

    
Liton 22.09.2010 07:47
quelle