दिलचस्प पोस्ट
अपने माता पिता के आयामों के आधार पर एक एंड्रॉइड व्यू आकार कैसे लाता है गोटो रिसाव चर का प्रयोग करेंगे? वेब स्क्रीन को स्वचालित रूप से पूर्ण स्क्रीन मोड में कैसे खोलें दी गई INSTALL_PACKAGES अनुमति के साथ, चुपचाप ऐप्स इंस्टॉल करें कोणीय 2 आंतरिक एचटीएमएल (क्लिक) बाइंडिंग फ़ाइल एक्सटेंशन से मेल करने के लिए pathPattern कोई कार्य नहीं करता है यदि कोई फ़ाइल फाइल नाम में कहीं मौजूद है? मैं कैसे एक subplot के रूप में एक matplotlib चित्रा वस्तु शामिल करते हैं? डीजेंगो rest_framework में अनुपलब्ध प्राधिकरण हैडर, क्या अपाचे का दोष है? वापसी कुंजी के साथ UITextView के लिए कीबोर्ड को कैसे खारिज करें? PHP सहयोगी सरणी डुप्लिकेट कीज़ जावा के बराबर सी # के शब्दशः स्ट्रिंग @ सभी वादों को हल करने की प्रतीक्षा करें जावा पहुंच संशोधक और अधिभावी विधियां सी ++ टेम्पलेट्स ट्यूरिंग-पूर्ण? मैं कैसे बताऊँगा कि क्या नियमित फाइल बाश में मौजूद नहीं है?

आकार का एक्स (x + +) एक्स क्यों नहीं बढ़ाता?

Dev c ++ windows में संकलित कोड है:

#include <stdio.h> int main() { int x = 5; printf("%d and ", sizeof(x++)); // note 1 printf("%d\n", x); // note 2 return 0; } 

मुझे उम्मीद है कि x को नोट 1 निष्पादित करने के बाद 6 होना चाहिए हालांकि, आउटपुट है:

 4 and 5 

क्या कोई भी समझा सकता है कि नोट 1 के बाद x क्यों नहीं बढ़ता?

वेब के समाधान से एकत्रित समाधान "आकार का एक्स (x + +) एक्स क्यों नहीं बढ़ाता?"

C99 मानक से (जोर मेरा है)

6.5.3.4/2

आकार ऑपरेटर अपने ऑपरेंड के आकार (बाइट्स) में उत्पन्न करता है, जो एक अभिव्यक्ति हो सकता है या एक प्रकार का कोष्ठक नाम हो सकता है। आकार ऑपरेंड के प्रकार से निर्धारित होता है। परिणाम एक पूर्णांक है यदि ऑपरेंड का प्रकार एक चर लंबाई सरणी प्रकार है, तो ऑपरेंड का मूल्यांकन किया जाता है; अन्यथा, ऑपरेंड का मूल्यांकन नहीं किया जाता है और परिणाम एक पूर्णांक स्थिरांक है

sizeof एक संकलन-समय ऑपरेटर है , इसलिए संकलन sizeof के समय और इसका परिचालन परिणाम मान द्वारा प्रतिस्थापित किया जाता है। ऑपरेंड का मूल्यांकन नहीं किया जाता है (सिवाय जब यह एक चर लंबाई सरणी है) बिल्कुल भी; केवल परिणाम के प्रकार के मामलों मायने रखता है

 short func(short x) { // this function never gets called !! printf("%d", x); // this print never happens return x; } int main() { printf("%d", sizeof(func(3))); // all that matters to sizeof is the // return type of the function. return 0; } 

आउटपुट:

 2 

के रूप में short मेरे मशीन पर 2 बाइट्स पर रह रहे हैं।

फ़ंक्शन के वापसी प्रकार को double करने के लिए परिवर्तित करना:

 double func(short x) { // rest all same 

आउटपुट के रूप में 8 देगा

sizeof(foo) संकलन के समय अभिव्यक्ति के आकार को खोजने के लिए वास्तव में कठिन प्रयास करता है:

6.5.3.4:

आकार ऑपरेटर अपने ऑपरेंड के आकार (बाइट्स) में उत्पन्न करता है, जो एक अभिव्यक्ति हो सकता है या एक प्रकार का कोष्ठक नाम हो सकता है। आकार ऑपरेंड के प्रकार से निर्धारित होता है। परिणाम एक पूर्णांक है यदि ऑपरेंड का प्रकार एक चर लंबाई सरणी प्रकार है, तो ऑपरेंड का मूल्यांकन किया जाता है; अन्यथा, ऑपरेंड का मूल्यांकन नहीं किया जाता है और परिणाम एक पूर्णांक स्थिरांक है

संक्षेप में: चर लंबाई एरे, रनटाइम पर चलाते हैं। (नोट: वेरिएबल लम्बाई एरेज़ एक विशिष्ट विशेषता हैं – नहीं malloc(3) साथ आवंटित सरणियों।) अन्यथा, केवल अभिव्यक्ति का प्रकार गणना की जाती है, और यह समय संकलन पर है।

sizeof एक कंपाइल-टाइम बिल्टिन ऑपरेटर है और फ़ंक्शन नहीं है। यह उन मामलों में बहुत स्पष्ट हो जाता है जिनसे आप इसे कोष्ठक के बिना उपयोग कर सकते हैं:

 (sizeof x) //this also works 

ध्यान दें

यह जवाब डुप्लिकेट से विलय किया गया था, जो देर की तारीख बताता है।

मूल

चर लंबाई सरणियों के अलावा, इसके आर्गुमेंट का मूल्यांकन नहीं करता है। हम इसे मसौदा C99 मानक खंड 6.5.3.4 से देख सकते हैं आकार ऑपरेटर पैराग्राफ 2 जो कहते हैं:

आकार ऑपरेटर अपने ऑपरेंड के आकार (बाइट्स) में उत्पन्न करता है, जो एक अभिव्यक्ति हो सकता है या एक प्रकार का कोष्ठक नाम हो सकता है। आकार ऑपरेंड के प्रकार से निर्धारित होता है। परिणाम एक पूर्णांक है यदि ऑपरेंड का प्रकार एक चर लंबाई सरणी प्रकार है, तो ऑपरेंड का मूल्यांकन किया जाता है; अन्यथा, ऑपरेंड का मूल्यांकन नहीं किया जाता है और परिणाम एक पूर्णांक स्थिरांक है

एक टिप्पणी ( अब हटाई गई ) पूछा कि क्या ऐसा कुछ रन-टाइम पर मूल्यांकन करेगा:

 sizeof( char[x++] ) ; 

और वास्तव में, ऐसा कुछ भी काम करेगा ( उन्हें दोनों रहते हैं देखें ):

 sizeof( char[func()] ) ; 

चूंकि वे दोनों चर लंबाई एरेज़ हैं यद्यपि, मैं या तो एक में ज्यादा व्यावहारिक उपयोग नहीं देख रहा हूँ

नोट, चर लंबाई सरणियों को C99 मानक खंड मसौदे में शामिल किया गया है 6.7.5.2 सरणी घोषणापत्र पैरा 4 :

[…] यदि आकार एक पूर्णांक स्थिर अभिव्यक्ति है और तत्व का प्रकार ज्ञात स्थिर आकार है, तो सरणी प्रकार एक चर लंबाई सरणी प्रकार नहीं है; अन्यथा, सरणी प्रकार एक चर लंबाई सरणी प्रकार है।

अद्यतन करें

सी 11 में VLA मामले के लिए जवाब में परिवर्तन, कुछ मामलों में यह निर्दिष्ट नहीं किया जाता है कि आकार अभिव्यक्ति का मूल्यांकन किया गया है या नहीं। खंड 6.7.6.2 अर्रे घोषणापत्रक जो कहते हैं:

[…] एक आकार की अभिव्यक्ति एक sizeof ऑपरेटर के ऑपरेंड का हिस्सा है और आकार अभिव्यक्ति के मूल्य को बदलने के ऑपरेटर के परिणाम को प्रभावित नहीं करेगा जहां, यह निर्दिष्ट नहीं है कि आकार अभिव्यक्ति का मूल्यांकन किया गया है या नहीं।

उदाहरण के लिए इस तरह के मामले में ( इसे देखें ):

 sizeof( int (*)[x++] ) 

जैसा कि sizeof ऑपरेटर का संचालन मूल्यांकन नहीं किया जाता है, आप ऐसा कर सकते हैं:

 int f(); //no definition, which means we cannot call it int main(void) { printf("%d", sizeof(f()) ); //no linker error return 0; } 

ऑनलाइन डेमो: http://ideone.com/S8e2Y

यही है, आप फ़ंक्शन को परिभाषित करने की आवश्यकता नहीं है अगर यह केवल sizeof में उपयोग किया जाता है इस तकनीक का उपयोग ज्यादातर सी ++ टेम्पलेट मेटाप्रोग्रामिंग में किया जाता है, जैसा कि सी ++ में भी, आकार के संचालन का मूल्यांकन नहीं किया जाता है।

यह काम क्यों करता है? यह काम करता है क्योंकि sizeof ऑपरेटर मूल्य पर काम नहीं करता है, इसके बजाय यह अभिव्यक्ति के प्रकार पर काम करता है। इसलिए जब आप sizeof(f()) लिखते हैं, तो यह अभिव्यक्ति f() के प्रकार पर चलती है, और जो कुछ भी नहीं है, लेकिन फ़ंक्शन f का रिटर्न प्रकार है। रिटर्न का प्रकार हमेशा एक ही होता है, कोई फर्क नहीं पड़ता कि अगर फ़ंक्शन वास्तव में कार्यान्वित करता है तो फ़ंक्शन लौट जाएगा।

सी ++ में, आप यह भी कर सकते हैं:

 struct A { A(); //no definition, which means we cannot create instance! int f(); //no definition, which means we cannot call it }; int main() { std::cout << sizeof(A().f())<< std::endl; return 0; } 

फिर भी यह आकार की तरह दिखता है, मैं पहली बार A() लिखकर, और फिर समारोह f को उदाहरण के तौर पर A().f() लिखकर A().f() लिखकर, लेकिन ऐसा कुछ नहीं होता।

डेमो: http://ideone.com/egPMi

यहाँ एक और विषय है जो sizeof कुछ अन्य दिलचस्प गुण बताते हैं:

  • आकार दो तर्क लेना

संकलन के दौरान निष्पादन नहीं हो सकता। तो ++i / i++ ऐसा नहीं होगा। इसके अलावा sizeof(foo()) फ़ंक्शन निष्पादित नहीं करेगा, लेकिन सही प्रकार वापस आ जाएगा।

sizeof() ऑपरेटर केवल डेटा-प्रकार का आकार देता है, यह आंतरिक तत्वों का मूल्यांकन नहीं करता है।