Division durch null - c-Programmierung
Ich habe eine Frage zu folgenden code:
int main {
double x = 0;
double y = 0/x;
if(y==1) {.....}
....
....
return 0;
}
Wenn ich den code auf meinem computer, ich bekomme kein runtime error und ich sehe, dass y = -nan(0x8000000000000)
. Warum es nicht zu einem Laufzeitfehler Division durch null?
Außerdem, wenn ich die erste Zeile zu int x = 0;
jetzt gibt es einen Laufzeitfehler. Was ist der Unterschied?
- Nein, Anhang F der C99-standard setzt und Sie nicht bekommen, nicht definiertes Verhalten für floating point. Nicht alle Implementierungen unterstützen Anhang F, aber dein und mein tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie sich nicht darauf verlassen, dass diese "arbeiten" (d.h. die gleiche Sache die ganze Zeit, tragbar), es ist Undefiniertes Verhalten in C für den zweiten Fall, und auch für die erste, wenn Ihre Umsetzung nicht definieren
__STDC_IEC_559__
(das ist, glaube ich, selten in diesen Tagen).C99, §6.5.5/5
Die Tatsache, dass Sie immer eine "not a Number" im einen Fall und im anderen nicht, ist, dass man fertig ist in floating-point Arithmetik, wo, auf Ihre Umsetzung (gemäß der IEEE-754-division durch null-Semantik),
0/0
gibt ein NaN.Im zweiten Fall sind Sie mit integer-Arithmetik – Undefiniertes Verhalten, es gibt keine Möglichkeit vorherzusagen, was passieren wird.
__STDC_IEC_559__
entsprechen den Spezifikationen in diesem Anhang. Wo eine Bindung zwischen der C-Sprache und IEC 60559 genannt, IEC60559 angegebene Verhalten wird übernommen durch Referenz, sofern nicht anders angegeben." §F. 3 "Die+
,-
,*
, und/
- Betreiber bieten die IEC-60559, addieren, subtrahieren, multiplizieren und dividieren Operationen."Der Grund, warum Sie nicht bekommen, eine Ausnahme oder Fehler ist, weil für ein Doppelzimmer, infinity und NaN sind definiert (siehe IEEE floating point), aber wenn Sie versuchen, das gleiche für integer, erhalten Sie eine Fehlermeldung, da NaN/Unendlich nicht definiert
0/0
kommt es auf die Umsetzung.n/0
ist UB. Der compiler kann diese entfernenif
-blockn=a/b; if(!b) {/*This code will be removed*/}
.Dies ist, weil IEEE 754 standard definiert spezielle Werte für positive und negative Unendlichkeit zusammen mit "keine Nummer" für floating-point Werte.
Nicht-floating-point-Typen wie
int
nicht über die spezielle Werte definiert und so die Laufzeit wird beendet durch un-behandelt Fehler.Dies ist nicht C-spezifisch ist, sehen Sie eine sehr ähnliche (wenn nicht gleiche) Verhalten auch in anderen Sprachen einfach, weil diese Funktionalität ist bis auf die hardware.