जवाबों:
क्योंकि सी मानक ऐसा कहता है, और उसे केवल वोट मिलता है।
परिणाम के रूप में:
sizeof (int)
ऑब्जेक्ट अभिव्यक्ति के बजाय आकार का ऑपरेंड एक कोष्ठक प्रकार हो सकता है ।int a; printf("%d\n", sizeof a);
पूरी तरह से ठीक है। उन्हें अक्सर देखा जाता है, सबसे पहले क्योंकि उन्हें एक प्रकार की कास्ट एक्सप्रेशन के भाग के रूप में आवश्यकता होती है, और दूसरी बात यह है कि साइज़ोफ़ में बहुत उच्च वरीयता होती है, इसलिए sizeof a + b
ऐसा नहीं हैsizeof (a+b)
। लेकिन वे आकार के आह्वान का हिस्सा नहीं हैं, वे ओपेरा का हिस्सा हैं।sizeof a++
संशोधित नहीं करता है)।एक फ़ंक्शन उन सभी बिंदुओं पर भिन्न होगा। एक फंक्शन और एक अनियारी ऑपरेटर के बीच संभवतः अन्य अंतर होते हैं, लेकिन मुझे लगता है कि यह दिखाने के लिए पर्याप्त है कि साइज़ोफ एक फ़ंक्शन नहीं हो सकता है, भले ही इसे करने का कोई कारण हो।
sizeof
अगर अभिव्यक्ति में वीएलए है, तो मानक भी साइड इफेक्ट की अनुमति देगा ।
sizeof
: sizeof unary-expression
और sizeof ( type-name )
- इसलिए C11 मानक में इसे 'कास्ट' नहीं बल्कि कोष्ठक प्रकार नाम माना जाता है। शुद्ध परिणाम बहुत अधिक है। (तुलना के लिए, एक कास्ट एक्सप्रेशन है ( type-name ) cast-expression
।) और मैं उस तरह से नफरत करता हूं जो टिप्पणी करता है कि मार्कडाउन Q & A मार्कडाउन से अलग तरीके से काम करता है!
यह एक संकलन-समय स्थिरांक के रूप में उपयोग किया जा सकता है, जो केवल तभी संभव है जब यह एक फ़ंक्शन के बजाय एक ऑपरेटर है। उदाहरण के लिए:
union foo {
int i;
char c[sizeof(int)];
};
सिंथेटिक अगर यह एक ऑपरेटर नहीं थे, तो यह एक प्रीप्रोसेसर मैक्रो होगा क्योंकि फ़ंक्शन प्रकारों को तर्क के रूप में नहीं ले सकते हैं। यह लागू करने के लिए एक कठिन मैक्रो होगा क्योंकि sizeof
दोनों प्रकार और चर को एक तर्क के रूप में ले सकते हैं।
क्योंकि सी मानक ऐसा कहता है, और उसे केवल वोट मिलता है।
और मानक शायद सही है क्योंकि sizeof
एक प्रकार और लेता है
सामान्य तौर पर, यदि किसी फ़ंक्शन के डोमेन या कोडोमैन (या दोनों) में वास्तविक संख्या की तुलना में तत्व अधिक जटिल होते हैं, तो उस फ़ंक्शन को ऑपरेटर के रूप में संदर्भित किया जाता है। इसके विपरीत, यदि न तो डोमेन और न ही किसी फ़ंक्शन के कोडोमेन में वास्तविक संख्या से अधिक जटिल तत्व होते हैं, तो उस फ़ंक्शन को केवल फ़ंक्शन के रूप में संदर्भित किया जा सकता है। त्रिकोणमितीय कार्य जैसे कोसाइन बाद के मामले के उदाहरण हैं।
इसके अतिरिक्त, जब फ़ंक्शंस का उपयोग इतनी बार किया जाता है कि वे जेनेरिक F (x, y, z, ...) फॉर्म की तुलना में तेज़ या आसान अंकन विकसित करते हैं, जिसके परिणामस्वरूप विशेष रूपों को ऑपरेटर भी कहा जाता है। उदाहरणों में "+" और डिवीजन "/" जैसे इन्फिक्स ऑपरेटर शामिल हैं, और फैक्टरियल जैसे पोस्टफ़िक्स ऑपरेटर "!"। यह उपयोग शामिल संस्थाओं की जटिलता से संबंधित नहीं है।
क्योंकि यह कोई फ़ंक्शन नहीं है। आप इसका उपयोग इस तरह कर सकते हैं:
int a;
printf("%d\n", sizeof a);
फंक्शन में एंट्री पॉइंट, कोड आदि होते हैं। फंक्शन को रनटाइम (या इनबिल्ट) पर चलाना होता है, आकार-प्रकार को कंपाइल-टाइम पर निर्धारित करना होता है।
sizeof ऑपरेटर संकलित समय इकाई नहीं रनटाइम है और फ़ंक्शन की तरह कोष्ठक की आवश्यकता नहीं है। जब कोड संकलित किया जाता है तो यह उस चर के आकार को संकलन समय पर बदल देता है लेकिन फ़ंक्शन में कार्य निष्पादित होने के बाद हम रिटर्निंग मान को जान पाएंगे।
इसलिये:
sizeof
"फ़ंक्शन" का आकार निर्धारित करने का कोई तरीका नहीं होगाफ़ंक्शन से छोटे अंतर हैं - आकार के मूल्य को संकलन समय पर हल किया जाता है, लेकिन रनटाइम पर नहीं!
क्योंकि यह एक संकलन-समय ऑपरेटर है, जो किसी वस्तु के आकार की गणना करने के लिए, टाइप जानकारी की आवश्यकता होती है जो केवल संकलन-समय पर उपलब्ध होती है। यह C ++ के लिए होल्ड नहीं है।
Sizeof (), मुझे लगता है कि स्पष्ट रूप से यह एक फ़ंक्शन और एक ऑपरेटर दोनों है। क्यों? क्योंकि एक फंक्शन एंट्री के स्टेज पर एंट्री के लिए कोष्ठक रखता है। लेकिन मुख्य रूप से एक ऑपरेटर का कारण यह भी होता है कि ऑपरेटर एक्शन कैरेक्टर होते हैं, इसलिए साइज़ोफ़ एक एक्शन स्टेटमेंट होता है जो कोष्ठक में ऑपरेटर पर कार्य करता है।