नीचे संकलन करने में विफल रहता है:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
लेकिन अगर मैं इसे बदलूं
sizeof(arr);
सब कुछ ठीक है। क्यों?
नीचे संकलन करने में विफल रहता है:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
लेकिन अगर मैं इसे बदलूं
sizeof(arr);
सब कुछ ठीक है। क्यों?
sizeof
उसी तरह का वर्णन करता है जिस तरह से C99 मानक आज करता है। sizeof
1989 में ANSI द्वारा C को मानकीकृत करने से पहले से उपलब्ध है।
जवाबों:
6.5.3 के अनुसार, sizeof
निम्नलिखित के रूप में दो रूप हैं :
sizeof unary-expression
sizeof ( type-name )
चूँकि arr
आपका कोड a है type-name
, इसे कोष्ठक करना है।
sizeof
एक ऑपरेटर है: कोष्ठक "प्रकार" से संबंधित है, ऑपरेटर नहीं।
sizeof
ऑपरेटर के रूप में करता है।
sizeof ( type-name )
:। लेकिन पहले रूप के लिए, आप लिख सकते हैं , उदाहरण के लिए sizeof(x)
, और यद्यपि यह एक फ़ंक्शन कॉल की तरह दिखता है (यदिsizeof
कोई कीवर्ड नहीं थे), यह वास्तव में एक कोष्ठक अभिव्यक्ति के लिए लागू एक ऑपरेटर है। क्या आपके मन में ऐसा था?
sizeof
, sizeof <SOMETHING>
कार्यों के विपरीत, उदाहरण के लिए, printf
जो कि है printf ( <SOMETHING> )
। कोष्ठक के हैं, printf
लेकिन नहीं sizeof
। जब sizeof
एक कोष्ठबद्ध प्रकार के नाम पर लागू किया जाता है, तो मुझे लगता है कि कुछ भी नहीं के कलाकारों के रूप में सोचना पसंद है - "वापस" बस प्रकार।
sizeof ( type-name )
अपनी तरह की अभिव्यक्ति के बारे में सोचना पसंद करता हूं । (मानक इसे एक ऑपरेटर कहता है, लेकिन ( type-name )
वास्तव में सामान्य अर्थों में एक ऑपरेंड नहीं है।)
भाषा जिस तरह से निर्दिष्ट की गई है, यहाँ टाइप नाम को छोटा किया जाना चाहिए।
मान लीजिए कि व्याकरण इस तरह दिखता है:
sizeof unary-expression
sizeof type-name
अब, उदाहरण के लिए निम्नलिखित अभिव्यक्ति अस्पष्ट होगी:
sizeof int * + 0
यह sizeof(int *) + 0
या तो हो सकता है sizeof(int) * +0
। यह अस्पष्टता एकात्मक अभिव्यक्तियों के लिए उत्पन्न नहीं होती है, क्योंकि एक अभिव्यक्ति के लिए जोड़ा जाने वाला तारांकन एक अभिव्यक्ति नहीं है (लेकिन कुछ प्रकार के नामों के लिए, एक को जोड़कर, फिर से एक प्रकार का नाम है)।
यहाँ कुछ निर्दिष्ट किया जाना था और टाइप-नाम को छोटा करने की आवश्यकता अस्पष्टता को हल करने का एक तरीका है।
मुझे लगता है कि यह आपके पास है typedef
। यदि आप इसे हटाते हैं, तो इसे संकलित करना चाहिए।
विकिपीडिया से उदाहरण:
/* the following code fragment illustrates the use of sizeof
* with variables and expressions (no parentheses needed),
* and with type names (parentheses needed)
*/
char c;
printf("%zu,%zu\n", sizeof c, sizeof (int));