क्या रिटर्न स्टेटमेंट में परिणाम के आसपास कोष्ठक महत्वपूर्ण हैं?


79

क्या किसी फ़ंक्शन के अंदर इन दो बयानों के बीच अंतर है?

bool returnValue = true;
// Code that does something
return(returnValue);

और इस?

bool returnValue = true;
// Code
return returnValue;

पूर्व में चारों ओर कोष्ठक हैं returnValue


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

1
किसी भी c++ / के लिए इस प्रश्न का उत्तर देना मुश्किल है c। भाषा की परिभाषा पर अधिक विशिष्ट होना अच्छा होगा, लेकिन मुझे नहीं पता कि उस 9 साल बाद कैसे ठीक किया जाए।
जोनास स्टीन

के लिए Cएक डुप्लिकेट stackoverflow.com/questions/161879/… है
जोनास स्टीन

जवाबों:


122

C ++ 14 के रूप में, वे अक्सर होते हैं।

C ++ 14 एक फ्रिंज केस जोड़ता है जहां वापसी मूल्य के आसपास कोष्ठक शब्दार्थ को बदल सकता है। यह कोड स्निपेट दो कार्यों को घोषित करता है। केवल अंतर वापसी मूल्य के आसपास कोष्ठक है।

int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))

पहले func1रिटर्न intमें और दूसरे में func1रिटर्न ए int&शब्दार्थ में अंतर सीधे आसपास के कोष्ठकों से संबंधित है

autoअपने नवीनतम रूप में विनिर्देशक सी ++ 11 में शुरू की गई थी। में सी ++ भाषा युक्ति यह रूप में वर्णित है:

निर्दिष्ट करता है कि जिस प्रकार का चर घोषित किया जा रहा है, वह अपने इनिशियलाइज़र से स्वचालित रूप से कट जाएगा। फ़ंक्शंस के लिए, निर्दिष्ट करता है कि रिटर्न प्रकार एक अनुगामी रिटर्न प्रकार है या इसके रिटर्न स्टेटमेंट से काट दिया जाएगा (C ++ 14 के बाद से)

साथ ही C ++ 11 ने उस विशेषांक को प्रस्तुत किया decltypeजो C ++ भाषा विनिर्देश में वर्णित है :

एक घोषित इकाई का निरीक्षण करता है या एक अभिव्यक्ति के रिटर्न प्रकार पर सवाल उठाता है।

[स्निप]

  1. यदि तर्क या तो किसी ऑब्जेक्ट / फ़ंक्शन का अनिर्दिष्ट नाम है, या एक सदस्य एक्सेस एक्सप्रेशन (object.member या पॉइंटर-> सदस्य) है, तो घोषणापत्र इस अभिव्यक्ति द्वारा निर्दिष्ट इकाई के घोषित प्रकार को निर्दिष्ट करता है।

  2. यदि तर्क टाइप टी का कोई अन्य अभिव्यक्ति है, तो

    a) यदि अभिव्यक्ति की मूल्य श्रेणी xvalue है, तो घोषणापत्र T && निर्दिष्ट करता है

    बी) यदि अभिव्यक्ति की मूल्य श्रेणी में कोई खराबी है, तो घोषणापत्र टी एंड निर्दिष्ट करता है

    c) अन्यथा, घोषणापत्र T को निर्दिष्ट करता है

[स्निप]

ध्यान दें कि यदि किसी वस्तु का नाम कोष्ठक है, तो यह एक लवल्यू एक्सप्रेशन बन जाता है, इस प्रकार डिक्वेस्ट (arg) और डिक्टाइप ((arg)) अक्सर विभिन्न प्रकार के होते हैं।

C ++ 14 में decltype(auto)फ़ंक्शन रिटर्न प्रकारों के लिए उपयोग करने की क्षमता की अनुमति दी गई थी। मूल उदाहरण हैं, जहां कोष्ठक के साथ शब्दार्थ अंतर खेल में आता है। मूल उदाहरणों को फिर से देखना:

int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))

decltype(auto)फ़ंक्शन में अनुगामी रिटर्न प्रकार को रिटर्न स्टेटमेंट पर इकाई / अभिव्यक्ति से घटाया जा सकता है। पहले संस्करण return var1;में प्रभावी रूप से टाइपिंग के समान ही है decltype(var1)( intनियम 1 से ऊपर का रिटर्न प्रकार) और दूसरे मामले में return (var1);यह प्रभावी रूप से उसी तरह है decltype((var1))( int &नियम 2 बी द्वारा रिटर्न प्रकार)।

कोष्ठक int&इसके बजाय वापसी प्रकार बनाते हैं int, इस प्रकार शब्दार्थ में परिवर्तन होता है। कहानी का नैतिक - "एक वापसी प्रकार पर सभी कोष्ठक समान नहीं बनाए गए हैं"


कोष्ठक के बिना वापसी बयान अभी भी एक अंतराल अभिव्यक्ति है, है ना? जब तक कि यह उस परिदृश्य में एक xvalue के रूप में नहीं माना जाता। क्या आप कोष्ठक के बिना वापसी के मूल्य श्रेणी की व्याख्या कर सकते हैं?
void.pointer

1
रिटर्न स्टेटमेंट इसमें प्राप्त एक्सप्रेशन के एक रीड को लौटाता है, यानी इसमें जो एक्सप्रेशन है उसमें से एक रिव्यू कैप्चर करता है और वह रिटर्न करता है। हम एक अंतराल कभी नहीं लौटते। यह संभव हो सकता है कि कुछ संकलक आपके द्वारा दिए गए विवरण से मेल खाते बग हैं, और आपके द्वारा यहां दिए गए कारणों के लिए, लेकिन यह कभी भी ऐसा नहीं होना चाहिए, जो return (x);इसके समकक्ष हो return &x;, और न ही इसके परिणामस्वरूप संभव हो। x का मान लेकिन x के प्रकार संदर्भ के साथ।
थियोडोर मर्डॉक

4
वाह, क्या एक छिपी हुई भाषा का निर्माण। बस पूरी तरह से ... अपारदर्शी। अच्छा लिखावट, धन्यवाद।
पॉल सैंडर्स

5
C ++ एक अत्यंत रोचक भाषा है। लेकिन छिपा इस तरह मुझे ड्राइव पागल कभी कभी "सुविधाओं" ...
andreee

हमारा कोड उन आवश्यक कोष्ठकों से भरा है। हम भी autoअक्सर उपयोग करते हैं । क्या जब तक हम इससे दूर रहेंगे, तब तक हमारा शब्दार्थ कभी नहीं बदलेगा decltype? मैं अनपेक्षित व्यवहार से डरता हूं जब हम अगले संकलक संस्करण पर जाते हैं जो अगले विज़ुअल स्टूडियो को शामिल करता है।
OneWorld

6

इसमें कोई फर्क नही है।

कोष्ठक का उपयोग करने का एक कारण होगा यदि आप लौटने से पहले एक अभिव्यक्ति का मूल्यांकन करना चाहते हैं लेकिन आपके उदाहरण में, कोई कारण नहीं होगा। देख:

कोष्ठक आसपास के वापसी मूल्यों

आगे की चर्चा के लिए।


3
हालांकि एक जटिल अभिव्यक्ति के साथ, ये कोष्ठक अभी भी एक अलग व्यवहार का कारण नहीं है। वे केवल मानवीय पाठकों के लिए अर्थ को अधिक स्पष्ट (विषयगत रूप से!) बनाते हैं।
19

@ कार्ल "लघुकोष्ठक का उपयोग करने का एक कारण यह होगा कि क्या आप लौटने से पहले अभिव्यक्ति का मूल्यांकन करना चाहते हैं" क्या आप इसका उदाहरण दे सकते हैं?
क्रिस मिडलटन

3
@ क्रिसमिडलटन नं, क्योंकि दावा उतना ही निरर्थक है जितना कि उस सूत्र में था। जो return m * x + cऔर return (m * x + c)या return ( (m * x) + c )आदि के बीच कोई कार्यात्मक अंतर नहीं है - और यह किसी भी बेहतर या अधिक सहज ज्ञान युक्त नहीं दिखता है, अगर आप मुझसे पूछें।
underscore_d

5

ऊपरी उदाहरण पर कोष्ठक सतही हैं; उन्हें प्रभावी रूप से नजरअंदाज किया जाता है।

यह कुछ ऐसा ही होगा ...

int x = (5);

यहाँ के कोष्ठक को भी अनदेखा कर दिया जाता है।


ठीक है, तकनीकी रूप से, उनकी उपेक्षा नहीं की जाती है , उनका अभिव्यक्ति के मूल्य पर कोई प्रभाव नहीं पड़ता है।
जॉन बोडे

1
@ जॉन: प्रभावी रूप से नजरअंदाज कर दिया। :)
जेम्स

3
+1 ... यह एकमात्र उत्तर है जो बताता है कि कोष्ठक वास्तव में निरर्थक हैं और यह दर्शाता है कि उनका उपयोग थोड़ा बेवकूफ है।
कोनराड रुडोल्फ

4

AFAIK, कुछ भी अलग नहीं है।

C ++ में, भावों का रूप हो सकता है: exprया (expr)। तो, उत्तरार्द्ध अधिक टाइपिंग के साथ एक अभिव्यक्ति है। इस बारे में आगे पढ़ने के लिए, एक व्याकरण ("अभिव्यक्ति" के लिए देखें) देखें।


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

3

नहीं, आपके कोड में कोई अंतर नहीं हैं।


3

मुझे लगता है booकि एक टाइपो है, और आप पूछ रहे हैं कि क्या कोई अंतर है

return expr;

तथा

return(expr);

जवाब न है।


2

कोई फर्क नहीं!!

यदि कोई जटिल अभिव्यक्ति शामिल है, तो लोग कोष्ठक का उपयोग करते हैं।

BTW returnएक कथन है एक फ़ंक्शन नहीं।


2

नहीं, दोनों के बीच कोई अंतर नहीं है, हालांकि आप कोष्ठक शामिल कर सकते हैं अगर यह अभिव्यक्ति को पढ़ने और स्पष्ट करने में आसान बनाता है।


1
... लेकिन ऐसा कभी नहीं होता। क्यों होगा? एक अनपेक्षित अभिव्यक्ति के बारे में पढ़ना मुश्किल क्या है? कोष्ठक जोड़ना मेरे लिए अव्यवस्था जैसा लगता है। जैसा कि स्पष्ट लग रहा है, लोगों को लगता returnहै कि एक लालची ऑपरेटर है और वह return m * x + cवापस आ सकता है mऔर बाकी को त्याग सकता है , या क्या?
अंडरस्कोर_ड

1

आप संयोग से कंपाइलर को धीमा कर रहे हैं!

कोष्ठक की उपस्थिति न केवल प्रीप्रोसेसिंग चरण को धीमा कर देती है, बल्कि वे एक अधिक जटिल सार सिंटैक्स ट्री भी उत्पन्न करते हैं: अधिक स्मृति, अधिक संगणना।


एक अर्थ की दृष्टि से? वे बिल्कुल समान हैं। कोष्ठक हैं या नहीं, returnकथन इसे वापस करने से पहले पूरी तरह से अभिव्यक्ति का मूल्यांकन करेगा।


5
मेरी सोच बिल्कुल। संकलक द्वारा अनावश्यक कार्य करने से व्यर्थ की अव्यवस्था उत्पन्न होती है यह बिना किसी अच्छे कारण के ब्रह्मांड की गर्मी से मृत्यु के करीब है।
मैक्सिम इगोरुस्किन

4
आप बिटकॉइन के बारे में कैसा महसूस करते हैं?
जेरेमी निकोलाई

0

वे समान हैं। मैं कोष्ठक वाक्यविन्यास को अक्सर देखता हूं, और मैं हमेशा इसका उपयोग करने वालों से पूछता हूं: क्यों ? और कोई भी जवाब नहीं दे सकता है कि वे इसका उपयोग क्यों करते हैं।

इसे संक्षेप में सम्‍मिलित करने के लिए, रिटर्निंग एक्‍सप्रेशन के आसपास कोष्ठक ऐसे लोगों द्वारा उपयोग किया जाता है, जो फ़ंक्शन-जैसे मैक्रोज़ और फ़ंक्शंस के बीच के अंतर को समझ नहीं पाते हैं, या जो सी में ऑपरेटर नियमों की पूर्वधारणा या मूल्यांकन नियमों के बारे में भ्रमित हैं, कोई कोडिंग नहीं है। कोष्ठक के उपयोग से शैली लाभ।

इस प्रकार

return value;

से ज्यादा सही है

return (value)

क्योंकि बाद में पता चलता है कि आप काफी कुछ नहीं जानते हैं कि आप क्या कर रहे हैं :)


-3

आपके मामले में दोनों समान हैं।


MM क्या आप कृपया अपनी टिप्पणी बता सकते हैं?
ज़शन खान

1
अगर aहै 5तो return a++;और return (a++);(जो एक ही है) दोनों वापस आ जाएंगे5
MM

2
विशिष्ट, पोस्टिक / डीक्रिमेंट अपने ऑपरेंड के प्री-मॉडिफिकेशन वैल्यू को लौटाता है, और किसी भी प्रकार के कोष्ठक या जोर-जबरदस्ती के अन्य बेकार प्रयास इसे नहीं बदलेंगे।
अंडरस्कोर_ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.