आकार को एक ऑपरेटर क्यों माना जाता है?


93

क्यों sizeofएक ऑपरेटर माना जाता है और एक फ़ंक्शन नहीं है?

ऑपरेटर के रूप में अर्हता प्राप्त करने के लिए कौन सी संपत्ति आवश्यक है?

जवाबों:


181

क्योंकि सी मानक ऐसा कहता है, और उसे केवल वोट मिलता है।

परिणाम के रूप में:

  • sizeof (int)ऑब्जेक्ट अभिव्यक्ति के बजाय आकार का ऑपरेंड एक कोष्ठक प्रकार हो सकता है ।
  • कोष्ठक अनावश्यक हैं: int a; printf("%d\n", sizeof a);पूरी तरह से ठीक है। उन्हें अक्सर देखा जाता है, सबसे पहले क्योंकि उन्हें एक प्रकार की कास्ट एक्सप्रेशन के भाग के रूप में आवश्यकता होती है, और दूसरी बात यह है कि साइज़ोफ़ में बहुत उच्च वरीयता होती है, इसलिए sizeof a + bऐसा नहीं हैsizeof (a+b) । लेकिन वे आकार के आह्वान का हिस्सा नहीं हैं, वे ओपेरा का हिस्सा हैं।
  • आप आकार का पता नहीं ले सकते।
  • अभिव्यक्ति जो आकार का ऑपरेंड है, रनटाइम पर मूल्यांकन नहीं किया जाता है ( sizeof a++संशोधित नहीं करता है)।
  • अभिव्यक्ति जो ओपेरॉफ़ का ऑपरेंड है, शून्य या फ़ंक्शन प्रकारों को छोड़कर किसी भी प्रकार का हो सकता है। दरअसल, यह आकार के बिंदु की तरह है।

एक फ़ंक्शन उन सभी बिंदुओं पर भिन्न होगा। एक फंक्शन और एक अनियारी ऑपरेटर के बीच संभवतः अन्य अंतर होते हैं, लेकिन मुझे लगता है कि यह दिखाने के लिए पर्याप्त है कि साइज़ोफ एक फ़ंक्शन नहीं हो सकता है, भले ही इसे करने का कोई कारण हो।


3
वाह, बस मैं क्या सोच रहा था!
दुर्घटनाग्रस्त

7
इसे बेहतर नहीं कह सकते।
क्लेमेंट हेर्रमैन

मेरा मानना ​​है कि आजकल वैरिएबल-लेंथ एरे (VLA) के कारण चीजें अधिक जटिल हैं। IIRC, sizeofअगर अभिव्यक्ति में वीएलए है, तो मानक भी साइड इफेक्ट की अनुमति देगा ।
हारून मैकडैड

@glglgl नहीं, इसका कोई मतलब नहीं है। उस संदर्भ में, (int)कुछ भी फैंसी नहीं है - केवल कोष्ठकों के अंदर एक प्रकार का नाम। यहां कोष्ठक वाक्य रचना का एक हिस्सा है sizeof- एक प्रकार का आकार लेते समय उनकी आवश्यकता होती है, लेकिन अभिव्यक्ति के आकार को लेते समय इसकी आवश्यकता नहीं होती है। यहाँ
anatolyg

1
मानक दो नोटेशन का उपयोग करता है sizeof: sizeof unary-expressionऔर sizeof ( type-name )- इसलिए C11 मानक में इसे 'कास्ट' नहीं बल्कि कोष्ठक प्रकार नाम माना जाता है। शुद्ध परिणाम बहुत अधिक है। (तुलना के लिए, एक कास्ट एक्सप्रेशन है ( type-name ) cast-expression।) और मैं उस तरह से नफरत करता हूं जो टिप्पणी करता है कि मार्कडाउन Q & A मार्कडाउन से अलग तरीके से काम करता है!
जोनाथन लेफ़लर

24

यह एक संकलन-समय स्थिरांक के रूप में उपयोग किया जा सकता है, जो केवल तभी संभव है जब यह एक फ़ंक्शन के बजाय एक ऑपरेटर है। उदाहरण के लिए:

union foo {
    int i;
    char c[sizeof(int)];
};

सिंथेटिक अगर यह एक ऑपरेटर नहीं थे, तो यह एक प्रीप्रोसेसर मैक्रो होगा क्योंकि फ़ंक्शन प्रकारों को तर्क के रूप में नहीं ले सकते हैं। यह लागू करने के लिए एक कठिन मैक्रो होगा क्योंकि sizeofदोनों प्रकार और चर को एक तर्क के रूप में ले सकते हैं।


4
+1 लेकिन ध्यान दें कि जब तर्क VLA - वैरिएबल लेंथ एरे होता है, तो यह कंपाइल-टाइम कॉन्स्टेंट नहीं होता है।
जोनाथन लेफलर

6

क्योंकि सी मानक ऐसा कहता है, और उसे केवल वोट मिलता है।

और मानक शायद सही है क्योंकि sizeofएक प्रकार और लेता है

सामान्य तौर पर, यदि किसी फ़ंक्शन के डोमेन या कोडोमैन (या दोनों) में वास्तविक संख्या की तुलना में तत्व अधिक जटिल होते हैं, तो उस फ़ंक्शन को ऑपरेटर के रूप में संदर्भित किया जाता है। इसके विपरीत, यदि न तो डोमेन और न ही किसी फ़ंक्शन के कोडोमेन में वास्तविक संख्या से अधिक जटिल तत्व होते हैं, तो उस फ़ंक्शन को केवल फ़ंक्शन के रूप में संदर्भित किया जा सकता है। त्रिकोणमितीय कार्य जैसे कोसाइन बाद के मामले के उदाहरण हैं।

इसके अतिरिक्त, जब फ़ंक्शंस का उपयोग इतनी बार किया जाता है कि वे जेनेरिक F (x, y, z, ...) फॉर्म की तुलना में तेज़ या आसान अंकन विकसित करते हैं, जिसके परिणामस्वरूप विशेष रूपों को ऑपरेटर भी कहा जाता है। उदाहरणों में "+" और डिवीजन "/" जैसे इन्फिक्स ऑपरेटर शामिल हैं, और फैक्टरियल जैसे पोस्टफ़िक्स ऑपरेटर "!"। यह उपयोग शामिल संस्थाओं की जटिलता से संबंधित नहीं है।

(विकिपीडिया)


यह शायद सी मानक (और अन्य प्रोग्रामिंग भाषाओं) की प्रेरणा को "ऑपरेटर" और "फ़ंक्शन" शब्दों का उपयोग करने के रूप में बताता है।
Steve

5

क्योंकि यह कोई फ़ंक्शन नहीं है। आप इसका उपयोग इस तरह कर सकते हैं:

int a;
printf("%d\n", sizeof a);

फंक्शन में एंट्री पॉइंट, कोड आदि होते हैं। फंक्शन को रनटाइम (या इनबिल्ट) पर चलाना होता है, आकार-प्रकार को कंपाइल-टाइम पर निर्धारित करना होता है।


2

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


1

इसलिये:

  • जब आप किसी फ़ंक्शन को मान देते हैं, तो ऑब्जेक्ट का आकार फ़ंक्शन में पास नहीं होता है, इसलिए ए sizeof "फ़ंक्शन" का आकार निर्धारित करने का कोई तरीका नहीं होगा
  • सी में, फ़ंक्शन केवल एक प्रकार के तर्क को स्वीकार कर सकते हैं; sizeof () को सभी प्रकार की डिफरेंशियल चीजें (चर के साथ-साथ प्रकारों को भी स्वीकार करने की जरूरत है! आप C में किसी फ़ंक्शन को टाइप नहीं कर सकते हैं)
  • एक फ़ंक्शन को कॉल करना तर्कों और अन्य अनावश्यक ओवरहेड की एक प्रतिलिपि बनाना शामिल है

1

फ़ंक्शन से छोटे अंतर हैं - आकार के मूल्य को संकलन समय पर हल किया जाता है, लेकिन रनटाइम पर नहीं!


7
वीएलए के अलावा - चर लंबाई सरणी - तर्क।
जोनाथन लेफ्लर

1

क्योंकि यह एक संकलन-समय ऑपरेटर है, जो किसी वस्तु के आकार की गणना करने के लिए, टाइप जानकारी की आवश्यकता होती है जो केवल संकलन-समय पर उपलब्ध होती है। यह C ++ के लिए होल्ड नहीं है।


0

sizeof()ऑपरेटर एक संकलन समय होता है। इसका उपयोग मापदंडों या तर्कों को निर्धारित करने के लिए किया जा सकता है।


-1

Sizeof (), मुझे लगता है कि स्पष्ट रूप से यह एक फ़ंक्शन और एक ऑपरेटर दोनों है। क्यों? क्योंकि एक फंक्शन एंट्री के स्टेज पर एंट्री के लिए कोष्ठक रखता है। लेकिन मुख्य रूप से एक ऑपरेटर का कारण यह भी होता है कि ऑपरेटर एक्शन कैरेक्टर होते हैं, इसलिए साइज़ोफ़ एक एक्शन स्टेटमेंट होता है जो कोष्ठक में ऑपरेटर पर कार्य करता है।

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