कभी भी ऐसा कोड न लिखें।
के लिए j<1000
, j/1000
शून्य (पूर्णांक विभाजन) है। इसलिए:
(&main + (&exit - &main)*(j/1000))(j+1);
के बराबर है:
(&main + (&exit - &main)*0)(j+1);
जो है:
(&main)(j+1);
जो main
साथ बुलाता है j+1
।
यदि j == 1000
, फिर वही रेखाएँ निकलती हैं:
(&main + (&exit - &main)*1)(j+1);
जिसे उबाल आता है
(&exit)(j+1);
जो है exit(j+1)
और कार्यक्रम छोड़ देता है।
(&exit)(j+1)
और exit(j+1)
अनिवार्य रूप से एक ही बात है - C99 ing6.3.2.1 / 4 को उद्धृत करना:
एक फ़ंक्शन डिज़ाइनर एक अभिव्यक्ति है जिसमें फ़ंक्शन प्रकार होता है। सिवाय इसके कि जब यह आकार ऑपरेटर या यूनिरी एंड ऑपरेटर का ऑपरेंड होता है , तो टाइप " फंक्शन रिटर्निंग टाइप " वाला फंक्शन डिज़ाइनर एक ऐसे एक्सप्रेशन में बदल जाता है, जिसमें " पॉइंटर टू फंक्शन रिटर्निंग टाइप " टाइप होता है ।
exit
एक फ़ंक्शन डिज़ाइनर है। यहां तक कि &
ऑपरेटर के एकतरफा पते के बिना , इसे कार्य करने के लिए एक संकेतक के रूप में माना जाता है। ( &
बस यह स्पष्ट करता है।)
और फ़ंक्शन कॉल §6.5.2.2 / 1 और निम्नलिखित में वर्णित हैं:
एक्सप्रेशन को निरूपित करने के लिए एक्सप्रेशन टाइप करने वाले एक्सप्रेशर में टाइप अर्र्टर होगा और एरे टाइप के अलावा किसी ऑब्जेक्ट को टाइप करने के लिए।
इसलिए exit(j+1)
फ़ंक्शन प्रकार के एक पॉइंटर-टू-फंक्शन प्रकार के स्वचालित रूपांतरण के कारण (&exit)(j+1)
काम करता है , और एक पॉइंटर-टू-फ़ंक्शन प्रकार के एक स्पष्ट रूपांतरण के साथ काम करता है।
कहा जा रहा है कि, उपरोक्त कोड अनुरूप नहीं है ( main
या तो दो तर्क या कोई भी नहीं लेता है), और &exit - &main
, मेरा मानना है कि .56.5.6 / 9 के अनुसार अपरिभाषित है:
जब दो बिंदुओं को घटाया जाता है, तो दोनों एक ही एरे ऑब्जेक्ट के तत्वों को इंगित करेंगे , या एरे ऑब्जेक्ट के अंतिम तत्व को एक अतीत; ...
जोड़ (&main + ...)
अपने आप में मान्य होगा, और इस्तेमाल किया जा सकता है, अगर जोड़ा गया मात्रा शून्य था, क्योंकि .56.5.6 / 7 कहते हैं:
इन संचालकों के उद्देश्यों के लिए, एक ऑब्जेक्ट के लिए एक पॉइंटर जो कि एरे का तत्व नहीं है, एक एलीमेंट के समान है जो ऑब्जेक्ट के एलीमेंट के पहले एलीमेंट के साथ ऑब्जेक्ट के प्रकार के समान है।
इसलिए शून्य को जोड़ना &main
ठीक होगा (लेकिन ज्यादा उपयोग नहीं)।
main
C ++ में कॉल नहीं कर सकते ।