C ++ không có Ngoại lệ "Division by Zero" để bắt. Hành vi bạn đang quan sát là kết quả của việc tối ưu hóa Trình biên dịch:
- Trình biên dịch giả định Hành vi không xác định không xảy ra
- Chia theo 0 trong C ++ là hành vi không xác định
- Do đó, mã có thể gây ra Division by Zero được cho là không làm như vậy.
- Và, mã phải gây ra Division by Zero được cho là sẽ không bao giờ xảy ra
- Do đó, trình biên dịch suy luận rằng vì Hành vi không xác định không xảy ra, nên các điều kiện cho Hành vi không xác định trong mã này (
d == 0
) không được xảy ra
- Do đó,
d / d
phải luôn luôn bằng 1.
Tuy nhiên...
Chúng tôi có thể buộc trình biên dịch kích hoạt phép chia "thực" cho 0 bằng một chỉnh sửa nhỏ đối với mã của bạn.
volatile int d = 0;
d /= d;
Vì vậy, bây giờ câu hỏi vẫn còn: bây giờ về cơ bản chúng tôi đã buộc trình biên dịch cho phép điều này xảy ra, điều gì sẽ xảy ra? Đó là hành vi không xác định — nhưng bây giờ chúng tôi đã ngăn trình biên dịch tối ưu hóa xung quanh hành vi không xác định này.
Hầu hết, nó phụ thuộc vào môi trường mục tiêu. Điều này sẽ không kích hoạt một ngoại lệ phần mềm, nhưng nó có thể (tùy thuộc vào CPU mục tiêu) kích hoạt một Ngoại lệ phần cứng (một Số nguyên-Chia-bằng-0), không thể bị bắt theo cách truyền thống, một ngoại lệ phần mềm có thể bị bắt. Đây chắc chắn là trường hợp của CPU x86 và hầu hết các kiến trúc khác (nhưng không phải tất cả!).
Tuy nhiên, có những phương pháp xử lý ngoại lệ phần cứng (nếu nó xảy ra) thay vì chỉ để chương trình gặp sự cố: hãy xem bài đăng này để biết một số phương pháp có thể áp dụng: Bắt ngoại lệ: chia cho không . Lưu ý rằng chúng khác nhau giữa các trình biên dịch.