10 Stimmen

Ist if(double) in C++ gültig?

Ich bin gerade auf diese Codezeile gestoßen:

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

donde length2 gibt eine double . Es ist mir ein Rätsel, dass 0,0 gleichbedeutend mit 0 ist, NULL und/oder false .

Ist dies Teil des C++-Standards oder ist es ein undefiniertes Verhalten?

10voto

Chubsdad Punkte 23861

Es handelt sich um ein Standardverhalten (Boolesche Konvertierung)

$4.12/1 - "Ein rWert der Arithmetik, Aufzählung, Zeiger, oder Zeiger auf Member-Typ kann in einen rWert vom Typ bool umgewandelt werden. Ein Nullwert, Null-Zeiger-Wert, oder Null-Member Zeigerwert wird in false umgewandelt; jeder andere Wert wird in true konvertiert."

6voto

Jonathan Leffler Punkte 694013

Ja - der Vergleich erfolgt gegen Null (0,0) und gibt false zurück, wenn das Ergebnis genau Null ist, und true, wenn nicht.

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

6voto

Joris Timmermans Punkte 10536

Es ist erwähnenswert, dass dieser Code für Fließkommadarstellungen extrem spröde ist. Dieser Code wird funktionieren, wenn und nur wenn die Fließkommazahl genau 0 ist, was eigentlich ziemlich unwahrscheinlich ist in den meisten Fällen. Es kann nicht in diesem speziellen Fall sein, aber es sollte sicherlich dokumentiert / kommentiert werden, wenn ja.

In praktisch allen anderen Situationen müssen Sie sich für eine "Epsilonwert" die den Bereich von Fließkommazahlen festlegt, den Sie als "gleich" betrachten - andernfalls werden Ihre Vergleiche Sie sehr wahrscheinlich in den Ecken (und oft auch in den nicht so eckigen) Fällen überraschen.

0voto

Tomasz Kowalczyk Punkte 10385

Wenn Sie ohne Operatoren vergleichen, vergleichen Sie "gegen wahr", d. h. jeder Variablentyp wird daraufhin überprüft, ob er entweder boolesch (einfacher Fall) oder anders ist. Bei numerischen Variablentypen ist der falsche Wert als "0", "0.0" oder so definiert, so dass der Vergleich "gegen true" false ergibt.

0voto

Liton Punkte 1340

Wenn length2 den Wert 0,0 liefert, wird dies als falsch gewertet. Bei diesem Vergleich kann es aber zu überraschenden Ergebnissen kommen. Verwenden Sie besser Epsilon-Wert als MadKeithV während Fließkomma-Vergleich vorgeschlagen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X