C ++ nie ma wyjątku „Dzielenie przez zero” do przechwycenia. Zachowanie, które obserwujesz, jest wynikiem optymalizacji kompilatora:
- Kompilator zakłada, że niezdefiniowane zachowanie nie występuje
- Dzielenie przez zero w C ++ jest niezdefiniowanym zachowaniem
- Dlatego zakłada się , że kod, który może powodować dzielenie przez zero, nie robi tego.
- Zakłada się , że kod, który musi spowodować podział na zero, nigdy się nie wydarzy
- Dlatego kompilator wnioskuje, że ponieważ nie występuje niezdefiniowane zachowanie, to warunki dla niezdefiniowanego zachowania w tym kodzie (
d == 0
) nie mogą wystąpić
- Dlatego
d / d
zawsze musi wynosić 1.
Jednak...
Możemy zmusić kompilator do wywołania „prawdziwego” dzielenia przez zero z niewielkimi zmianami w kodzie.
volatile int d = 0;
d /= d;
Więc teraz pozostaje pytanie: teraz, kiedy w zasadzie zmusiliśmy kompilator, aby pozwolił na to, co się dzieje? Jest to niezdefiniowane zachowanie - ale teraz uniemożliwiliśmy kompilatorowi optymalizację wokół tego niezdefiniowanego zachowania.
W większości zależy to od środowiska docelowego. To nie wyzwoli wyjątku programowego, ale może (w zależności od docelowego procesora) wyzwolić wyjątek sprzętowy (Integer-Divide-by-zero), którego nie można przechwycić w tradycyjny sposób, można przechwycić wyjątek programowy. Tak jest z pewnością w przypadku procesora x86 i większości innych (ale nie wszystkich!) Architektur.
Istnieją jednak metody radzenia sobie z wyjątkiem sprzętowym (jeśli wystąpi) zamiast po prostu pozwolić na awarię programu: spójrz na ten post, aby znaleźć kilka metod, które mogą mieć zastosowanie: Wyłapywanie wyjątku: dzielenie przez zero . Zauważ, że różnią się one od kompilatora do kompilatora.