दिलचस्प पोस्ट
कैसे angularjs में एक सरणी को देखने के लिए गहरा? पायथन स्ट्रिंग 'जॉइन' तेज (')' से '+' है, लेकिन यहाँ क्या गलत है? हेक्सागोन का उत्तरदायी ग्रिड जावास्क्रिप्ट के साथ चयनित HTML पाठ कैसे प्राप्त करें? कैसे लॉक प्रतीक्षा समयबाह्य डीबग करने के लिए MySQL पर पार? एंड्रॉइड में एक HTTP GET अनुरोध के लिए पैरामीटर कैसे जोड़ें? बूटस्ट्रैप 3: पृष्ठ ताज़ा पर चयनित टैब रखें एंड्रॉइड ऐप से फेसबुक पेज खोलें? सी: एक सिस्टम कमांड चलाने और आउटपुट प्राप्त करें? क्या मैं जीडीबी में 'मेमोरी एक्सेस' पर ब्रेकपॉइंट सेट कर सकता हूं? अतिरिक्त क्लासपाथ विकल्प के साथ "java -jar myfile.jar" कॉल करें सॉकेट विकल्प SO_REUSEADDR और SO_REUSEPORT, वे कैसे भिन्न होते हैं? क्या उनका मतलब सभी प्रमुख ऑपरेटिंग सिस्टमों में ही है? JSON के लिए SqlAlchemy परिणाम serialize करने के लिए कैसे? मैं NSArray पर कैसे पुनरावृत्त हो सकता हूं? केंद्र और दायां संरेखित करें फ्लेक्सबॉक्स तत्व

आकार का एक्स (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() ऑपरेटर केवल डेटा-प्रकार का आकार देता है, यह आंतरिक तत्वों का मूल्यांकन नहीं करता है।