C ++ no tiene una excepción de "División por cero" para detectar. El comportamiento que está observando es el resultado de las optimizaciones del compilador:
- El compilador asume que el comportamiento indefinido no ocurre
- La división por cero en C ++ es un comportamiento indefinido
- Por lo tanto, se presume que el código que puede causar una división por cero no lo hace.
- Y se presume que el código que debe causar una división por cero nunca sucederá
- Por lo tanto, el compilador deduce que debido a que el comportamiento indefinido no ocurre, las condiciones para el comportamiento indefinido en este código (
d == 0
) no deben ocurrir.
- Por lo tanto,
d / d
siempre debe ser igual a 1.
Sin embargo...
Podemos forzar al compilador a activar una división "real" por cero con un pequeño ajuste a su código.
volatile int d = 0;
d /= d;
Así que ahora la pregunta sigue siendo: ahora que básicamente hemos forzado al compilador a permitir que esto suceda, ¿qué sucede? Es un comportamiento indefinido, pero ahora hemos evitado que el compilador optimice este comportamiento indefinido.
Principalmente, depende del entorno de destino. Esto no activará una excepción de software, pero puede (dependiendo de la CPU de destino) activar una excepción de hardware (un entero-dividir por cero), que no se puede detectar de la manera tradicional. Este es definitivamente el caso de una CPU x86 y la mayoría de las otras arquitecturas (¡pero no todas!).
Sin embargo, existen métodos para lidiar con la excepción de hardware (si ocurre) en lugar de simplemente dejar que el programa se bloquee: mire esta publicación para ver algunos métodos que podrían ser aplicables: Captura de excepción: dividir por cero . Tenga en cuenta que varían de un compilador a otro.