क्या किसी फ़ंक्शन के अंदर इन दो बयानों के बीच अंतर है?
bool returnValue = true;
// Code that does something
return(returnValue);
और इस?
bool returnValue = true;
// Code
return returnValue;
पूर्व में चारों ओर कोष्ठक हैं returnValue
।
क्या किसी फ़ंक्शन के अंदर इन दो बयानों के बीच अंतर है?
bool returnValue = true;
// Code that does something
return(returnValue);
और इस?
bool returnValue = true;
// Code
return returnValue;
पूर्व में चारों ओर कोष्ठक हैं returnValue
।
c++
/ के लिए इस प्रश्न का उत्तर देना मुश्किल है c
। भाषा की परिभाषा पर अधिक विशिष्ट होना अच्छा होगा, लेकिन मुझे नहीं पता कि उस 9 साल बाद कैसे ठीक किया जाए।
C
एक डुप्लिकेट stackoverflow.com/questions/161879/… है
जवाबों:
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 ++ भाषा विनिर्देश में वर्णित है :
एक घोषित इकाई का निरीक्षण करता है या एक अभिव्यक्ति के रिटर्न प्रकार पर सवाल उठाता है।
[स्निप]
यदि तर्क या तो किसी ऑब्जेक्ट / फ़ंक्शन का अनिर्दिष्ट नाम है, या एक सदस्य एक्सेस एक्सप्रेशन (object.member या पॉइंटर-> सदस्य) है, तो घोषणापत्र इस अभिव्यक्ति द्वारा निर्दिष्ट इकाई के घोषित प्रकार को निर्दिष्ट करता है।
यदि तर्क टाइप टी का कोई अन्य अभिव्यक्ति है, तो
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
, इस प्रकार शब्दार्थ में परिवर्तन होता है। कहानी का नैतिक - "एक वापसी प्रकार पर सभी कोष्ठक समान नहीं बनाए गए हैं"
return (x);
इसके समकक्ष हो return &x;
, और न ही इसके परिणामस्वरूप संभव हो। x का मान लेकिन x के प्रकार संदर्भ के साथ।
auto
अक्सर उपयोग करते हैं । क्या जब तक हम इससे दूर रहेंगे, तब तक हमारा शब्दार्थ कभी नहीं बदलेगा decltype
? मैं अनपेक्षित व्यवहार से डरता हूं जब हम अगले संकलक संस्करण पर जाते हैं जो अगले विज़ुअल स्टूडियो को शामिल करता है।
इसमें कोई फर्क नही है।
कोष्ठक का उपयोग करने का एक कारण होगा यदि आप लौटने से पहले एक अभिव्यक्ति का मूल्यांकन करना चाहते हैं लेकिन आपके उदाहरण में, कोई कारण नहीं होगा। देख:
आगे की चर्चा के लिए।
return m * x + c
और return (m * x + c)
या return ( (m * x) + c )
आदि के बीच कोई कार्यात्मक अंतर नहीं है - और यह किसी भी बेहतर या अधिक सहज ज्ञान युक्त नहीं दिखता है, अगर आप मुझसे पूछें।
ऊपरी उदाहरण पर कोष्ठक सतही हैं; उन्हें प्रभावी रूप से नजरअंदाज किया जाता है।
यह कुछ ऐसा ही होगा ...
int x = (5);
यहाँ के कोष्ठक को भी अनदेखा कर दिया जाता है।
AFAIK, कुछ भी अलग नहीं है।
C ++ में, भावों का रूप हो सकता है: expr
या (expr)
। तो, उत्तरार्द्ध अधिक टाइपिंग के साथ एक अभिव्यक्ति है। इस बारे में आगे पढ़ने के लिए, एक व्याकरण ("अभिव्यक्ति" के लिए देखें) देखें।
मुझे लगता है boo
कि एक टाइपो है, और आप पूछ रहे हैं कि क्या कोई अंतर है
return expr;
तथा
return(expr);
जवाब न है।
कोई फर्क नहीं!!
यदि कोई जटिल अभिव्यक्ति शामिल है, तो लोग कोष्ठक का उपयोग करते हैं।
BTW return
एक कथन है एक फ़ंक्शन नहीं।
नहीं, दोनों के बीच कोई अंतर नहीं है, हालांकि आप कोष्ठक शामिल कर सकते हैं अगर यह अभिव्यक्ति को पढ़ने और स्पष्ट करने में आसान बनाता है।
return
है कि एक लालची ऑपरेटर है और वह return m * x + c
वापस आ सकता है m
और बाकी को त्याग सकता है , या क्या?
आप संयोग से कंपाइलर को धीमा कर रहे हैं!
कोष्ठक की उपस्थिति न केवल प्रीप्रोसेसिंग चरण को धीमा कर देती है, बल्कि वे एक अधिक जटिल सार सिंटैक्स ट्री भी उत्पन्न करते हैं: अधिक स्मृति, अधिक संगणना।
एक अर्थ की दृष्टि से? वे बिल्कुल समान हैं। कोष्ठक हैं या नहीं, return
कथन इसे वापस करने से पहले पूरी तरह से अभिव्यक्ति का मूल्यांकन करेगा।
वे समान हैं। मैं कोष्ठक वाक्यविन्यास को अक्सर देखता हूं, और मैं हमेशा इसका उपयोग करने वालों से पूछता हूं: क्यों ? और कोई भी जवाब नहीं दे सकता है कि वे इसका उपयोग क्यों करते हैं।
इसे संक्षेप में सम्मिलित करने के लिए, रिटर्निंग एक्सप्रेशन के आसपास कोष्ठक ऐसे लोगों द्वारा उपयोग किया जाता है, जो फ़ंक्शन-जैसे मैक्रोज़ और फ़ंक्शंस के बीच के अंतर को समझ नहीं पाते हैं, या जो सी में ऑपरेटर नियमों की पूर्वधारणा या मूल्यांकन नियमों के बारे में भ्रमित हैं, कोई कोडिंग नहीं है। कोष्ठक के उपयोग से शैली लाभ।
इस प्रकार
return value;
से ज्यादा सही है
return (value)
क्योंकि बाद में पता चलता है कि आप काफी कुछ नहीं जानते हैं कि आप क्या कर रहे हैं :)
आपके मामले में दोनों समान हैं।
a
है 5
तो return a++;
और return (a++);
(जो एक ही है) दोनों वापस आ जाएंगे5