C ++ में "Zero by Division" अपवाद को पकड़ने के लिए नहीं है। आप जो व्यवहार देख रहे हैं वह कंपाइलर अनुकूलन का परिणाम है:
- संकलक मानता है कि अपरिभाषित व्यवहार नहीं होता है
- C ++ में Zero द्वारा विभाजन अपरिभाषित व्यवहार है
- इसलिए, कोड जो कर सकते हैं शून्य से एक प्रभाग के कारण ऐसा नहीं माना जाता है।
- और, जो कोड को शून्य द्वारा एक डिवीजन का कारण होना चाहिए वह कभी नहीं होने के लिए माना जाता है
- इसलिए, कंपाइलर यह कटौती करता है कि क्योंकि अपरिभाषित व्यवहार नहीं होता है, तो इस कोड में अपरिभाषित व्यवहार के लिए शर्तें (
d == 0
) नहीं होनी चाहिए
- इसलिए,
d / d
हमेशा 1 के बराबर होना चाहिए।
तथापि...
हम संकलक को आपके कोड में एक मामूली ट्विक के साथ शून्य द्वारा "वास्तविक" विभाजन को ट्रिगर करने के लिए मजबूर कर सकते हैं।
volatile int d = 0;
d /= d;
तो अब सवाल यह है कि अब हमने मूल रूप से संकलक को ऐसा करने की अनुमति देने के लिए मजबूर किया है, क्या होता है? यह अपरिभाषित व्यवहार है- लेकिन अब हमने कंपाइलर को इस अपरिभाषित व्यवहार के आसपास अनुकूलन करने से रोक दिया है।
अधिकतर, यह लक्ष्य वातावरण पर निर्भर करता है। यह एक सॉफ़्टवेयर अपवाद को ट्रिगर नहीं करेगा, लेकिन यह एक हार्डवेयर अपवाद (एक इंटेगर-डिवाइड-बाय-ज़ीरो) को ट्रिगर कर सकता है (लक्ष्य सीपीयू के आधार पर), जिसे पारंपरिक तरीके से पकड़ा नहीं जा सकता है, सॉफ़्टवेयर अपवाद को पकड़ा जा सकता है। यह निश्चित रूप से एक x86 सीपीयू के लिए मामला है, और सबसे अन्य (लेकिन सभी नहीं!) आर्किटेक्चर।
हालाँकि, प्रोग्राम को क्रैश होने के बजाय हार्डवेयर अपवाद (यदि ऐसा होता है) से निपटने के तरीके हैं: इस पोस्ट को कुछ तरीकों के लिए देखें जो लागू हो सकते हैं: अपवाद को पकड़ना: शून्य से विभाजित करना । ध्यान दें कि वे संकलक से संकलक तक भिन्न होते हैं।