2010-10-17 15 views
6

सी ++ एएनएसआई आईएसओ आईईसी 14882 2003 अनुलग्नक सी .1 (पेज 668):lvalue करने वाली rvalue आईएसओ सी में एक सरणी के रूपांतरण

बदलें: एक सशर्त अभिव्यक्ति, एक काम अभिव्यक्ति, या एक अल्पविराम का परिणाम अभिव्यक्ति बीन lvalue
तर्क: सी + + एक वस्तु उन्मुख भाषा है, जो लालसा पर अपेक्षाकृत अधिक जोर दे रही है। उदाहरण के लिए, कार्य lvalues ​​वापस कर सकते हैं।
मूल सुविधा पर प्रभाव: अच्छी तरह से परिभाषित सुविधा के अर्थशास्त्र में बदलें। कुछ सी अभिव्यक्ति जो स्पष्ट रूप से लैवल्यू-टू-रावल्यू रूपांतरणों पर भरोसा करते हैं, वे अलग-अलग परिणाम प्राप्त करेंगे। उदाहरण के लिए,

char arr[100]; 
sizeof(0, arr) 

सी + + में 100 पैदावार और सी
में sizeof(char*) ...

मैं बस आज इस पढ़ रहा था और मुझे याद है कि दो महीने एक मेरा एक दोस्त जाना एक समस्या का प्रस्ताव दिया गया था जो एक समारोह लिखना था जो 0 लौटाएगा यदि इसे सी ++ और 1 के साथ संकलित किया गया था, तो इसे सी के साथ संकलित किया गया था। मैंने इस तथ्य का लाभ उठाया कि सी में एक संरचना बाहरी दायरे में थी। इसलिए, इस नई जानकारी पर विचार करते हुए, मैंने फैसला किया कि यह उपरोक्त समस्या का एक और समाधान होगा, जिस पर मैंने माइक्रोसॉफ्ट विजुअल स्टूडियो 2008 पर कोशिश की थी, लेकिन इस पर ध्यान दिए बिना कि इसे सी या सी ++ कोड sizeof(0, arr) के रूप में संकलित किया गया है, तो हमेशा 4 उत्पन्न होता है। तो 2 प्रश्न:

1. आईएसओ सी क्या है? क्या यह वर्तमान सी मानक है? क्या यह एकमात्र है (मैंने सुना है कि सी तेजी से विकसित हो रहा है) 2. क्या यह एक माइक्रोसॉफ्ट सी ++ बग है?

TIA

संपादित करें: माफ करना उत्पादन के साथ मिश्रित और यह संपादित कर ली:

+1

एमएसवीसी 2010 के साथ, 'आकार (0, एआर)' का मूल्यांकन '4' (जब सी ++ के रूप में संकलित किया गया) का मूल्यांकन होता है। जी ++ के साथ, यह '100' का मूल्यांकन करता है। –

उत्तर

1

या सिर्फ माइक्रोसॉफ्ट के सी में बाइट की कुल संख्या नहीं है आईएसओ है सी लेकिन कुछ अन्य मानक सी (यदि कोई मौजूद है)।

माइक्रोसॉफ्ट विजुअल C अभी भी C89 का समर्थन करता है [केवल] जीसीसी/बजना आदि समर्थन C99 भी जो वर्तमान मानक है जैसे अन्य compilers जबकि।

C99 [धारा 6.5.17/2] कहते हैं

एक अल्पविराम ऑपरेटर के बाईं संकार्य एक शून्य अभिव्यक्ति के रूप में मूल्यांकन किया जाता है; इसके मूल्यांकन के बाद एक अनुक्रम बिंदु है। फिर सही ऑपरेंड का मूल्यांकन किया जाता है; परिणाम का प्रकार और मूल्य है।

इस प्रकार sizeof (0,arr) का परिणाम होगा sizeof(char*) नहीं 100*sizeof(char)

sizeof(arr) [सूचक प्रकार के निहित lvaluervalue करने के लिए रूपांतरण/स्वत: क्षय के कारण] 6.5.3.4/3

से 100*sizeof(char) दिया होता 95) एक अल्पविराम ऑपरेटर एक लाभा उत्पन्न नहीं करता है।


फैसला किया है कि इस से ऊपर समस्या है, जो मैं माइक्रोसॉफ्ट विजुअल स्टूडियो 2008 को की कोशिश की करने के लिए एक और समाधान होगा, लेकिन क्या यह के रूप में संकलित किया गया है की परवाह किए बिना सी या सी ++ कोड sizeof (0, आगमन) हमेशा पैदावार 4.

सी ++ 03 [5.18/1] अल्पविराम ऑपरेटर

प्रकार और परिणाम की मान रहे हैं प्रकार और दाएं ऑपरेंड का मूल्य; इसका परिणाम एक लवल्यू है यदि इसका दायां ऑपरेंड है।

तो sizeof(0, arr) = sizeof (arr) और जो 100* sizeof(char) और नहीं = sizeof(char*) के बराबर होगा।

तो एमएसवीसी ++ गलत परिणाम दे रहा है (सी ++ कोड के मामले में)।

+0

@P्रासून: 95 करता है) सी या सी ++ का संदर्भ लें? –

+0

@ आर्मेन: 'सी 99' [..] स्पष्टता के लिए मेरी पोस्ट संपादित की। –

+0

कभी-कभी मुझे आश्चर्य होता है कि मैं अभी भी एमएसवीसी का उपयोग क्यों कर रहा हूं। लेकिन फिर उनके पास एक शानदार आईडीई है ... –

5

आईएसओ सी सी मानक है। वर्तमान वाला सी 99 है लेकिन सी 1 एक्स कोने के आसपास सही है। तेजी से, आप एक नया मानक हर दशक मतलब या तो है, तो हाँ, यह तेजी से विकसित हो रहा है :-)

धारा 6.5.3.4/3 आईएसओ C99 की तो कहा गया है:

जब एक संकार्य के लिए आवेदन किया उस प्रकार चार, अहस्ताक्षरित चार, या हस्ताक्षर किए चार, (या उसके एक योग्य संस्करण) परिणाम 1.

जब एक संकार्य सरणी प्रकार है कि करने के लिए लागू है, परिणाम सरणी में बाइट की कुल संख्या है है ।

0

सरणी के लिए, sizeof कुल आकार देता है। पॉइंटर्स के रूप में पारित सरणी के बारे में सावधान रहें।

C99 मानक:

जब एक संकार्य है कि सरणी प्रकार के लिए लागू है, परिणाम सरणी