C ++ hat keine "Division by Zero" -Ausnahme zu fangen. Das beobachtete Verhalten ist das Ergebnis von Compiler-Optimierungen:
- Der Compiler geht davon aus, dass undefiniertes Verhalten nicht auftritt
- Die Division durch Null in C ++ ist ein undefiniertes Verhalten
- Daher wird angenommen, dass Code, der eine Division durch Null verursachen kann , dies nicht tut.
- Und Code, der eine Division durch Null verursachen muss, wird vermutlich nie vorkommen
- Daher schließt der Compiler, dass die Bedingungen für undefiniertes Verhalten in diesem Code (
d == 0
) nicht erfüllt sein dürfen , da undefiniertes Verhalten nicht auftritt
- Daher
d / d
muss immer gleich 1 sein.
Jedoch...
Wir können den Compiler zwingen, eine "echte" Division durch Null mit einer geringfügigen Änderung Ihres Codes auszulösen.
volatile int d = 0;
d /= d;
Nun bleibt die Frage: Nun, da wir den Compiler grundsätzlich gezwungen haben, dies zuzulassen, was passiert dann? Es ist undefiniertes Verhalten - aber wir haben jetzt verhindert, dass der Compiler dieses undefinierte Verhalten optimiert.
Meistens hängt es von der Zielumgebung ab. Dies löst keine Software-Ausnahme aus, kann jedoch (abhängig von der Ziel-CPU) eine Hardware-Ausnahme (eine Ganzzahl-Division durch Null) auslösen, die nicht auf herkömmliche Weise abgefangen werden kann, wenn eine Software-Ausnahme abgefangen werden kann. Dies ist definitiv der Fall für eine x86-CPU und die meisten anderen (aber nicht alle!) Architekturen.
Es gibt jedoch Methoden, um mit der Hardware-Ausnahme umzugehen (falls sie auftritt), anstatt nur das Programm abstürzen zu lassen: In diesem Beitrag finden Sie einige Methoden, die möglicherweise anwendbar sind: Ausnahme abfangen: durch Null teilen . Beachten Sie, dass sie von Compiler zu Compiler unterschiedlich sind.