2010-12-31 23 views
6

मान लें कि मैं सी या सी ++ में char c[99] = {'Stack Overflow'}; लिखता हूं। यह ठीक संकलित करता है लेकिन क्या यह मान्य है? वैध रूप से मेरा मतलब किसी भी तरह के अपरिभाषित या अनिर्दिष्ट व्यवहार का आह्वान नहीं करना था।क्या यह एक वैध सी कथन है?

फिर से अगर मैं char c[99] = 'Stack Overflow'; लिखता हूं तो जीसीसी मल्टीचार्टेर स्थिरता के बारे में शिकायत करता है जो स्पष्ट है लेकिन उपरोक्त में जब मैं घुंघराले ब्रैकेट कंपाइलर के भीतर संलग्न हूं तो खुश है! ऐसा क्यों है?

मुझे यह भी पता चलता है कि puts(c); पहले कथन के बाद Stack Overflow के सामान्य स्ट्रिंग के सटीक चरित्र को 'w' आउटपुट करेगा। ऐसा क्यों?

क्या कोई इन व्यवहारों को अलग से समझा सकता है?

+3

इसे संकलित करें और पता लगाएं। – Falmarri

+5

उसने पहले ही कहा है कि उसने इसे संकलित किया है ... – indiv

+22

@ फाल्मररी: मुझे लगता है कि आप आरटीएफक्यू पुरस्कार जीतते हैं। उन्होंने कहा "यह ठीक संकलित करता है" और आउटपुट का भी वर्णन करता है, जाहिर है कि उसने इसका परीक्षण किया था। लेकिन परीक्षण आपको यह नहीं बताता है कि यह मानक द्वारा पोर्टेबल या अच्छी तरह परिभाषित है या नहीं। –

उत्तर

14

वे दोनों केवल एक ही शाब्दिक हैं, इसलिए c[0] शाब्दिक और c[1] ... c[98] शून्य (NUL चरित्र) से भरा करने के लिए सेट कर दिया जाता है।

मुझे लगता है कि c[0] में वास्तव में क्या मूल्य भरा जाता है कार्यान्वयन निर्भर है, लेकिन इसे कम से कम किसी भी अनुपालन कंपाइलर पर संकलित करना चाहिए।

संपादित करें: कम से कम C++ 0x में मानक के खिलाफ सत्यापित,:

एक multicharacter शाब्दिक टाइप int और कार्यान्वयन से परिभाषित मूल्य है।

और C99 में (the draft का उपयोग कर, कारण यह मुफ़्त है):

(जैसे, 'ab'), एक से अधिक चरित्र युक्त एक पूर्णांक चरित्र निरंतर या एक चरित्र युक्त या अनुक्रम भागने का मूल्य जो एकल-बाइट निष्पादन चरित्र को मैप नहीं करता है, कार्यान्वयन-डीआईएफड है।

+1

+1 आपका स्वागत है –

+0

हम्म लेकिन क्यों कर्ली कोष्ठक के साथ बयान संकलक का वाक्यात्मक जाँच गुजरता – Quixotic

+1

@Philando:।? क्योंकि यह एक है " यौगिक प्रारंभकर्ता "का प्रयोग एक सरणी को शुरू करने के लिए किया जा रहा है? यह पूरी तरह से कानूनी है। इस बात का कोई नियम नहीं है कि कंपाउंड प्रारंभकर्ताओं के पास एक से अधिक तत्व होना चाहिए, वास्तव में 'int [10] = {0};' जैसी चीजें बहुत आम हैं। –

1

सहमत - विंडोज कर्नेल कोड में - आपको बहुत सारी टैगिंग मेमोरी दिखाई देती है। और यह वास्तव में प्रति मंच लागू किया गया है। हालांकि, वे स्मृति टैग करने के लिए उलझन का उपयोग करते हैं, और यह हमेशा 4-वर्ण का शाब्दिक क्रम में शाब्दिक होता है: उलटा टैगमेमरी = 'केएससीएफ';

व्याख्या प्लेटफ़ॉर्म-विशिष्ट है, लेकिन वर्णों की एक धारा है।

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