क्यों और कब) मुझे आकार के बाद कोष्ठक का उपयोग करने की आवश्यकता है?


80

नीचे संकलन करने में विफल रहता है:

लेकिन अगर मैं इसे बदलूं

सब कुछ ठीक है। क्यों?


एक ऑपरेटर के रूप में आकार एएनआई-सी में उपलब्ध नहीं है
ग्रिम

2
@ कोस्त्या: के एंड आर की मेरी प्रति (सी भाषा का सबसे पहला विवरण जो मेरे पास है) बहुत दूर है और मैं अब इसकी जांच नहीं कर सकता, लेकिन मुझे 110% यकीन है कि यह sizeofउसी तरह का वर्णन करता है जिस तरह से C99 मानक आज करता है। sizeof1989 में ANSI द्वारा C को मानकीकृत करने से पहले से उपलब्ध है।
pmg

जवाबों:


120

6.5.3 के अनुसार, sizeofनिम्नलिखित के रूप में दो रूप हैं :

चूँकि arrआपका कोड a है type-name, इसे कोष्ठक करना है।


15
+1 और, बस इसे मजबूत करने के लिए जो sizeofएक ऑपरेटर है: कोष्ठक "प्रकार" से संबंधित है, ऑपरेटर नहीं।
पी.एम.जी.

@pmg: स्पष्टीकरण के लिए धन्यवाद! हाँ, जैसा कि आपने उल्लेख किया है, मानक निरूपित करता हैsizeof ऑपरेटर के रूप में करता है।
Ise Wisteria

4
@pmg: मुझे नहीं लगता कि यह स्पष्ट है कि कोष्ठक "क्या" है। दूसरे फॉर्म के सिंटैक्स में तीन टोकन और एक गैर-टर्मिनल होता है sizeof ( type-name ):। लेकिन पहले रूप के लिए, आप लिख सकते हैं , उदाहरण के लिए sizeof(x), और यद्यपि यह एक फ़ंक्शन कॉल की तरह दिखता है (यदिsizeof कोई कीवर्ड नहीं थे), यह वास्तव में एक कोष्ठक अभिव्यक्ति के लिए लागू एक ऑपरेटर है। क्या आपके मन में ऐसा था?
कीथ थॉम्पसन

3
मेरे कहने का मतलब यह है कि sizeof, sizeof <SOMETHING>कार्यों के विपरीत, उदाहरण के लिए, printfजो कि है printf ( <SOMETHING> )। कोष्ठक के हैं, printfलेकिन नहीं sizeof। जब sizeofएक कोष्ठबद्ध प्रकार के नाम पर लागू किया जाता है, तो मुझे लगता है कि कुछ भी नहीं के कलाकारों के रूप में सोचना पसंद है - "वापस" बस प्रकार।
शाम

2
@pmg: आप निश्चित रूप से इसे इस तरह से सोच सकते हैं, लेकिन मुझे यह भ्रामक लगता है। एक कलाकार के लिए एकमात्र वास्तविक समानता यह है कि इसमें कोष्ठक में एक प्रकार का नाम है, और यह केवल वाक्यविन्यास सुविधा का एक संयोग है। मैं sizeof ( type-name )अपनी तरह की अभिव्यक्ति के बारे में सोचना पसंद करता हूं । (मानक इसे एक ऑपरेटर कहता है, लेकिन ( type-name )वास्तव में सामान्य अर्थों में एक ऑपरेंड नहीं है।)
कीथ थॉम्पसन

44

भाषा जिस तरह से निर्दिष्ट की गई है, यहाँ टाइप नाम को छोटा किया जाना चाहिए।

मान लीजिए कि व्याकरण इस तरह दिखता है:

sizeof unary-expression sizeof type-name

अब, उदाहरण के लिए निम्नलिखित अभिव्यक्ति अस्पष्ट होगी:

यह sizeof(int *) + 0या तो हो सकता है sizeof(int) * +0। यह अस्पष्टता एकात्मक अभिव्यक्तियों के लिए उत्पन्न नहीं होती है, क्योंकि एक अभिव्यक्ति के लिए जोड़ा जाने वाला तारांकन एक अभिव्यक्ति नहीं है (लेकिन कुछ प्रकार के नामों के लिए, एक को जोड़कर, फिर से एक प्रकार का नाम है)।

यहाँ कुछ निर्दिष्ट किया जाना था और टाइप-नाम को छोटा करने की आवश्यकता अस्पष्टता को हल करने का एक तरीका है।


-3

मुझे लगता है कि यह आपके पास है typedef। यदि आप इसे हटाते हैं, तो इसे संकलित करना चाहिए।

विकिपीडिया से उदाहरण:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.