कार्यों के संबंध में इनमें से कौन सा उत्तर गलत है?


17

इसलिए जब मैं कुछ लंबा संकलन कर रहा हूं तो मैंने ओडिसी पर सी ++ सामान्य परीक्षण लेने का फैसला किया और इस सवाल पर आया।

यह प्रश्न

अगर मैं गलत नहीं हूँ, तो शब्दांकन (या उसके अभाव) को देखते हुए ये सब सच हो सकता है।

ए।

int Foo() { }
int Foo(int bar) { }

ख। अच्छी तरह से, return void;शब्दार्थिक रूप से गलत होगा , लेकिन फ़ंक्शन स्पष्ट रूप से voidरिटर्न प्रकार हो सकते हैं।

void Foo() { }

सी। यह इनलाइन फ़ंक्शन की परिभाषा है, हाँ।

घ। निम्नलिखित तत्वों की नियुक्ति के बारे में अधिक जानकारी के बिना,

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

इसके अलावा, आप लैम्बदास और फंक्शनलर्स का उपयोग करके हमेशा ऐसा कर सकते हैं ।

इ।

void Foo(int& bar)
{
    ++bar;
}

int foobar = 5;
Foo(foobar);

च।

int bar = 5;

int& GetBar()
{
    return bar;
}

GetBar() = 6;

जी।

int bar = 5;

int* GetBar()
{
    return &bar;
}

(*GetBar()) = 5;

मैं यह देखने में विफल हूं कि इस प्रश्न का कोई सही गलत उत्तर कहां है। क्या मैं कुछ भूल रहा हूँ?

कहने की जरूरत नहीं कि मैं समय से बाहर भाग गया और पूरी बात को विफल कर दिया। मुझे लगता है कि मैं एक बुरा C ++ प्रोग्रामर हूं। :(


18
यहाँ आकर कुछ बच्चों के घर के काम करने वाले बच्चे पर चिल्लाना शुरू हुआ, सुखद आश्चर्य हुआ।
SomeKittens

वास्तव में सभी भाषाओं के लिए आवश्यक नहीं है कि इनलाइन फ़ंक्शंस का विस्तार किया जाए। "इनलाइन" डेल्फी में एक कमांड के बजाय एक संकलक संकेत है, और सी, सी ++ में अपवाद हैं । तो "ग" भी गलत हो सकता है। एक उत्तर लिखना अधिक मनोरंजक हो सकता है जिसमें दिखाया जा सकता है कि प्रत्येक कथन गलत कैसे हो सकता है।
मोच

1
@ @ यदि केवल एक टेक्स्ट बॉक्स था। मैं वापस जाना चाहता हूं और "इस प्रश्न के साथ एक समस्या की रिपोर्ट करें" को हिट करें।
किक्स

5
यह एक प्रकार का कार्य नहीं है। यह फ़ंक्शन पॉइंटर्स की एक सरणी है।
user253751

यह सच है, लेकिन सवाल वास्तव में स्पष्ट नहीं है (कम से कम मेरे लिए यह नहीं था)।
Qix

जवाबों:


21

यह पूरा सवाल ही बौना है। प्रश्न कथन में कई विकल्पों की संभावना है, जबकि रेडियो बटन एकल विकल्प को इंगित करता है।

इसके अलावा, बी बहुत संदिग्ध है, क्योंकि शून्य फ़ंक्शन कुछ भी वापस नहीं करते हैं।

डी भी संदिग्ध है, जहाँ तक मुझे पता है, आपके पास कार्यों की एक सरणी नहीं हो सकती है। ज़रूर, आपके पास फ़ंक्शन पॉइंटर्स की एक सरणी हो सकती है, लेकिन यह बिल्कुल एक ही चीज़ नहीं है।


सही; डी यह पूछने जैसा है कि क्या आप कॉल कर सकते हैं int। ज़रूर, अगर आप इसे एक पॉइंटर में डालते हैं और यह पॉइंटर किसी फ़ंक्शन को संदर्भित करता है ...
Qix

1
मैं शर्त लगाने के लिए तैयार हूं कि वह उत्तर है जिसके लिए वे जा रहे हैं, लेकिन हां, सवाल खराब है।
को रोबोट

हालांकि voidफ़ंक्शंस किसी भी मान को वापस नहीं करते हैं , फिर भी वे प्रकार को वापस करते हैं void। इस प्रकार मैं कहता हूं कि B सत्य है।
थॉमस ईडिंग

@ThomasEding यह अभी भी उनके हिस्से पर बहुत बुरा शब्द है। तुम नहीं return void;, बल्कि इसके बजाय return;
Qix

10

उत्तर c) यकीनन झूठ भी है।

"इनवोकेशन ओवरहेड से बचने के लिए संकलन समय के दौरान इनलाइन फ़ंक्शन का विस्तार किया जाता है।"

सबसे पहले, C ++ कंपाइलर को inlineफ़ंक्शंस का विस्तार न करके संकेत को अनदेखा करने की अनुमति है ।

दूसरे, विस्तार करने के लिए कहा गया "कारण" एक ओवरसिम्प्लीफिकेशन है। वास्तव में, विस्तार (या नहीं) करने का असली कारण पूरी तरह से संकलक लेखक के हाथों में है।


आप सही हैं, लेकिन मैं इसके बारे में सोच रहा था 'ठीक है, संकलक ने निर्धारित किया है कि यहinline संकेत के बजाय एक फ़ंक्शन को इनलाइन करना चाहता है ।'
Qix 3

ठीक है, संकलक संकेत को पूरी तरह से अनदेखा नहीं कर सकता है। कम से कम यह अनिवार्य प्रभाव है, जो ओडीआर के लिए एक अपवाद है।
डेडुप्लिकेटर

@ डेडप्लिकेटर - हाँ यह हो सकता है। "कोई बात नहीं कि आप इनलाइन के रूप में किसी फ़ंक्शन को कैसे नामित करते हैं, यह एक अनुरोध है कि कंपाइलर को अनदेखा करने की अनुमति दी जाती है: कंपाइलर इनलाइन का विस्तार कर सकता है, कुछ, सभी, या उन स्थानों में से कोई भी जहाँ आप फ़ंक्शन को इनलाइन के रूप में नामित करते हैं।" - source isocpp.org/wiki/faq/Inline-Functions
स्टीफन सी

@StephenC: इसे इनलाइन विस्तारित करने के अनुरोध को अनदेखा किया जा सकता है, हाँ। मैंने केवल यह कहा था कि ODR का स्पष्ट अपवाद नहीं हो सकता।
डिडुप्लिकेटर

समझा। मैंने अपने उत्तर के शब्दांकन को अद्यतन कर दिया है
स्टीफन सी

7

सी। यह इनलाइन फ़ंक्शन की परिभाषा है, हाँ।

यह पूरी तरह से सही नहीं है।
इसके नाम के बावजूद, कीवर्ड inlineयह गारंटी नहीं देता है कि कोई फ़ंक्शन इनबिल्ट होगा। केवल एक चीज जो आप सुनिश्चित कर सकते हैं कि कंपाइलर कई बार इनलाइन फ़ंक्शन की परिभाषा देखता है तो शिकायत नहीं करेगा।

इसलिए, कड़ाई से बोलते हुए, विकल्प सी गलत है, लेकिन मुझे नहीं लगता कि यह उत्तर है कि क्विज़ के लेखक उम्मीद करते हैं, क्योंकि एक ऐसा उत्तर है जो और भी गलत है।

घ। निम्नलिखित तत्वों की नियुक्ति के बारे में अधिक जानकारी के बिना,

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

इसके अलावा, आप लैम्बदास और फंक्शनलर्स का उपयोग करके हमेशा ऐसा कर सकते हैं।

अपने उदाहरण में, functionsकी एक सरणी है की ओर इशारा कार्य करता है और न कार्यों के लिए खुद की एक सरणी। इसी तरह, लंबोदर और फंक्शनलर्स वास्तव में फ़ंक्शन नहीं हैं। वे ऐसी कक्षाएं हैं जो फ़ंक्शन-कॉल ऑपरेटर का जवाब देती हैं, लेकिन यह उन्हें C ++ भाषा की परिभाषा की दृष्टि से कार्य नहीं करता है।

C ++ में फ़ंक्शंस दूसरे श्रेणी के नागरिकों की तरह थोड़े हैं। आप उन्हें परिभाषित और कॉल कर सकते हैं, लेकिन जैसे ही आप फ़ंक्शन प्रकार के साथ कुछ और करने की कोशिश करते हैं (जैसे कि उनमें से एक सरणी बनाएं), आपको या तो एक त्रुटि मिलती है या वे चुपचाप खुद को एक पॉइंटर में परिवर्तित करते हैं।


मैं डी बिट से सहमत हूं, लेकिन मैं उन cकार्यों के रूप में पढ़ रहा था जो पहले से inlineही कीवर्ड बनाम इनलाइनिंग के लिए सकारात्मक रूप से चिह्नित किए गए हैं । मैं समझता हूं कि inlineएक संकेत है।
Qix

4

कुछ भी हो, तो उसे बी होना होगा । आप नहीं कर सकते हैं returnएक void, लेकिन आप एक लौट सकते हैं null। फ़ंक्शन घोषणा पर शून्य लौटाए गए मूल्य की कमी के संकलक को सूचित करने के लिए होना चाहिए।

शून्य प्रकार

C और C ++ में

शून्य परिणाम प्रकार के साथ एक फ़ंक्शन या तो फ़ंक्शन के अंत तक पहुंच जाता है या बिना रिटर्न वैल्यू के साथ रिटर्न स्टेटमेंट निष्पादित करता है। शून्य प्रकार भी फ़ंक्शन फ़ंक्शन के एकमात्र तर्क के रूप में प्रकट हो सकता है ताकि यह इंगित किया जा सके कि फ़ंक्शन कोई तर्क नहीं लेता है। ध्यान दें कि नाम के बावजूद, इन सभी स्थितियों में, शून्य प्रकार एक इकाई प्रकार के रूप में कार्य करता है, न कि शून्य या निचला प्रकार के रूप में, भले ही एक वास्तविक इकाई प्रकार जो एक सिंगलटन के विपरीत हो, शून्य प्रकार एक रिक्त समाहित करने के लिए कहा जाता है मूल्यों का सेट, और भाषा किसी वस्तु को घोषित करने या प्रकार शून्य के साथ एक मूल्य का प्रतिनिधित्व करने का कोई तरीका प्रदान नहीं करती है।


2
-1: जबकि voidफ़ंक्शंस किसी भी मान को वापस नहीं करते हैं , फिर भी वे प्रकार को वापस करते हैं void। इस प्रकार मैं कहता हूं कि B सत्य है।
थॉमस ईडिंग

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