-Wsequence-point
सक्षम के साथ, जीसीसी को उपयोगकर्ता को चेतावनी दी जानी चाहिए जब अपरिभाषित व्यवहार कोड देखा जाता है। उदाहरण के लिएइस उदाहरण में जीसीसी ने चेतावनी नहीं दी है
b = a + ++a;
जीसीसी द्वारा देखा जाना चाहिए और जहां "अपरिभाषित व्यवहार" कोड सूचित किया जाना चाहिए (क्योंकि आईएसओ सी वर्धन के लिए ऑपरेंड के मूल्यांकन के क्रम निर्दिष्ट नहीं है)।
हालांकि, मैं वाक्य रचना के साथ खेला जाता है और मैं इस एक कोशिश की:
int *a = malloc(sizeof(int) * 2);
a[0] = 1;
printf("%d\n", *(a + (*a)++ - *a));
बेशक, मैं चेतावनी
चेतावनी मिल गया: पर '* एक' अपरिभाषित किया जा सकता है [आपरेशन - Wsequence सूत्री]
जो मैं क्या उम्मीद है, क्योंकि *a
का मान (जो a[0]
है) वृद्धि की जा सकती है या नहीं, जबकि हो सकता है तीसरे ऑपरेंड को संसाधित करना लेकिन, मैंने निम्नलिखित की कोशिश की:
int *a = malloc(sizeof(int) * 2);
a[0] = 1;
printf("%d\n", *(a + (*a)++ - 1));
मुझे आश्चर्य हुआ क्योंकि मुझे कोई चेतावनी नहीं मिली। क्या यह यूबी भी नहीं होना चाहिए? मेरा मतलब है, आईएसओ सी 99 के अनुसार, वृद्धि वृद्धि ऑपरेशन का मूल्यांकन किसी भी बिंदु पर अभिव्यक्ति मूल्यांकन (अल्पविराम ऑपरेटरों और टर्नरी ऑपरेटरों को छोड़कर) पर किया जा सकता है। मेरे बाद के उदाहरण में, मैं सूचक को बढ़ा नहीं रहा हूं, बल्कि इसके बजाय पूर्णांक यह इंगित करता है। इसलिए, मानक के अनुसार, इसे किसी भी बिंदु पर बढ़ाया जा सकता है (जिसका अर्थ यह है कि पूरे अभिव्यक्ति का मूल्यांकन करने के बाद इसे बढ़ाया जा सकता है), इसलिए प्रोग्राम 1
या 2
दोनों को प्रिंट कर सकता है, है ना?
जीसीसी कोई चेतावनी क्यों नहीं फेंकता है? या किसी को याद किया था? क्या मैंने चश्मा गलत तरीके से समझ लिया?