2012-03-20 12 views
47

क्यों है इस कोड को reddit पर मिला। मैंने सोचा होगा कि प्रकार के रूपांतरणों से यह अमान्य हो गया होगा।यह मान्य सी

int a[3] = { { {1, 2}, {3, 4}, 5, 6 }, {7, 8}, {9}, 10 }; 

क्लैंग पर, मुझे स्केलर प्रारंभकर्ता में अत्यधिक तत्वों और ब्रेसिज़ के बारे में कुछ चेतावनियां मिलती हैं। लेकिन a की सामग्री [1, 7, 9] है।

क्या यह वास्तव में वैध है, और यदि ऐसा है, तो क्या कोई यह समझा सकता है कि वास्तव में क्या चल रहा है?

+5

+1, गंभीरता से दिलचस्प। – ApprenticeHacker

+4

जीसीसी के साथ मुझे 24 चेतावनी मिलती हैं। महान सवाल मैं रहता हूं और सीखता हूं :-) – gbulmer

+1

ये जीसीसी! कम से कम आपको एक चेतावनी मिलती है। – boatcoder

उत्तर

28

अतिरिक्त तत्वों को अभी अनदेखा किया जाता है। 6.7.8 प्रारंभिक के दो भाग हैं जिनकी आप परवाह करते हैं। सबसे पहले, अनुच्छेद 17:

प्रत्येक ब्रेस-संलग्न प्रारंभकर्ता सूची में एक मौजूदा ऑब्जेक्ट है। जब कोई पदनाम मौजूद नहीं होता है, तो वर्तमान ऑब्जेक्ट के प्रकार के अनुसार वर्तमान ऑब्जेक्ट के उप-प्रोजेक्ट प्रारंभ किए जाते हैं: सबस्क्राइज़ ऑर्डर बढ़ाने में सरणी तत्व, घोषणा आदेश में संरचना सदस्य, और संघ के पहले नामित सदस्य।

वह बताता है कि आपको 1, 7, और 9 क्यों मिलता है - वर्तमान वस्तु उन ब्रेसिज़ द्वारा निर्धारित की जाती है। इसके बाद यह पैराग्राफ 20:

... सूची से केवल पर्याप्त प्रारंभकर्ता तत्वों या उपसमूह के सदस्यों या सदस्यों के पहले सदस्य के लिए खाते में लिया जाता है निहित संघ; किसी भी शेष प्रारंभकर्ता को अगले तत्व या कुल के सदस्य को प्रारंभ करने के लिए छोड़ दिया जाता है, जिसमें वर्तमान उप-योग या निहित संघ एक हिस्सा है।

+0

लेकिन क्यों? और यह नेस्टेड तत्वों को पास करने के लिए मान्य क्यों है जहां कोई संरचना/संघ/वर्ग प्रकार नहीं हैं? – ams

+1

क्या आप उस मानक के यूआरएल को साझा करना चाहते हैं जिसे आप उद्धृत कर रहे हैं? – dldnh

+0

[पीडीएफ लिंक।] (Http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf) –

2
int a[3] = { { {1, 2}, {3, 4}, 5, 6 }, {7, 8}, {9}, 10 }; 

अमान्य है।

यह एक ही कारण int b[1] = {1, 2}; के लिए अमान्य है अमान्य है: क्योंकि C99 कहते

(C99, 6.7.8p1) "नहीं प्रारंभकर्ता इकाई के भीतर समाहित न एक वस्तु के लिए एक मूल्य प्रदान करने के लिए प्रारंभ किया जा रहा प्रयास करेगा । "

पिछले तत्व 10a initializers में इकाई प्रारंभ किया जा रहा में न एक वस्तु के लिए एक मूल्य प्रदान करने के लिए प्रयास करता है।

+0

मुझे आपके द्वारा उद्धृत संदर्भ द्वारा किए गए विभिन्न दावों पर एक अच्छी बहस सुनना अच्छा लगेगा, और कार्ल द्वारा उद्धृत दूसरा संदर्भ। मानकों के भीतर एक स्पष्ट संघर्ष होने लगता है, जो संकल्प कार्यान्वयन में अंतर होने तक भिन्नता का कारण बन जाएगा। Diff को इंगित करने के लिए +1। – ryyker

संबंधित मुद्दे