Division durch Null - c Programmierung

7

Ich habe eine Frage zum nächsten Code:

%Vor%

Wenn ich den Code auf meinem Computer starte, erhalte ich keinen Laufzeitfehler und ich sehe y = -nan(0x8000000000000) . Warum ist es kein Laufzeitfehler, durch Null zu teilen?

Zusätzlich, wenn ich die erste Zeile in int x = 0; ändere jetzt gibt es einen Laufzeitfehler. Was ist der Unterschied?

    
wantToLearn 28.10.2012, 16:44
quelle

3 Antworten

13

Man kann sich nicht auf dieses "Arbeiten" verlassen (dh die ganze Zeit das gleiche tun, portabel), es ist ein undefiniertes Verhalten in C für den zweiten Fall, und auch für den ersten Fall, wenn Ihre Implementierung nicht definiert __STDC_IEC_559__ (das ist, glaube ich, selten in diesen Tagen).

C99, § 6.5.5 / 5

  

Das Ergebnis des / Operators ist der Quotient aus der Division des ersten Operanden durch den   zweite; Das Ergebnis des% -Operators ist der Rest. In beiden Vorgängen, wenn der Wert von   der zweite Operand ist Null, das Verhalten ist nicht definiert.

Die Tatsache, dass Sie in einem Fall eine "Not a Number" bekommen und nicht in der anderen, ist die, die in der Gleitkomma-Arithmetik ausgeführt wird, wo Sie in Ihrer Implementierung (gemäß IEEE 754 Division durch Null-Semantik) arbeiten. , 0/0 ergibt ein NaN.

Im zweiten Fall verwenden Sie Ganzzahlarithmetik - undefiniertes Verhalten, es gibt keine Vorhersage, was passieren wird.

    
Mat 28.10.2012 16:48
quelle
9

Der Grund, warum Sie keine Ausnahme oder Fehler erhalten, ist, dass für ein Doppel unendlich und NaN definiert sind (siehe IEEE floating point ), aber wenn Sie dasselbe für Integer versuchen, erhalten Sie einen Fehler, weil NaN / Infinity nicht definiert sind

    
Suhail Patel 28.10.2012 16:46
quelle
4

Dies liegt daran, dass der Standard IEEE 754 spezielle Werte für positive und negative Unendlichkeit sowie "keine Zahl" für Floating definiert -Punktwerte.

Nicht-Gleitkomma-Typen wie int haben diese speziellen Werte nicht definiert und daher wird die Laufzeit aufgrund eines nicht behandelten Fehlers beendet.

Dies ist nicht C-spezifisch, Sie werden ein sehr ähnliches (wenn nicht das gleiche) Verhalten in anderen Sprachen sehen, einfach weil diese Funktionalität auf Hardware basiert.

    
user405725 28.10.2012 16:49
quelle

Tags und Links