वापसी में सी ++ में अल्पविराम ऑपरेटर का अलग व्यवहार?


83

यह ( अल्पविराम ऑपरेटर ध्यान दें ):

#include <iostream>
int main() {
    int x;
    x = 2, 3;
    std::cout << x << "\n";
    return 0;
}

आउटपुट 2

हालांकि, यदि आप returnअल्पविराम ऑपरेटर के साथ उपयोग करते हैं, तो :

#include <iostream>
int f() { return 2, 3; }
int main() {
    int x;
    x = f();
    std::cout << x << "\n";
    return 0;
}

आउटपुट 3

अल्पविराम ऑपरेटर अलग व्यवहार क्यों कर रहा है return?


जवाबों:


140

संचालक वरीयता के अनुसार , अल्पविराम ऑपरेटर की तुलना में कम पूर्वता है operator=, इसलिए x = 2,3;इसके बराबर है (x = 2),3;। (ऑपरेटर पूर्वता यह निर्धारित करता है कि ऑपरेटर अपने तर्क के अनुसार अन्य ऑपरेटरों की तुलना में अपने तर्कों, तंग या शिथिलता के लिए कैसे बाध्य होगा।)

ध्यान दें अल्पविराम अभिव्यक्ति (x = 2),3यहाँ है, नहीं 2,3x = 2पहले मूल्यांकन किया जाता है (और इसके दुष्प्रभावों को पूरा किया जाता है), फिर परिणाम को छोड़ दिया जाता है, फिर 3मूल्यांकन किया जाता है (यह वास्तव में कुछ भी नहीं करता है)। इसलिए मूल्य xहै 2। ध्यान दें कि 3संपूर्ण अल्पविराम अभिव्यक्ति (यानी x = 2,3) का परिणाम है , इसे असाइन करने के लिए उपयोग नहीं किया जाएगा x। (इसे बदलें x = (2,3);, के xसाथ सौंपा जाएगा 3)

के लिए return 2,3;, अल्पविराम अभिव्यक्ति का मूल्यांकन किया जाता है 2,3, 2फिर उसके परिणाम को छोड़ दिया जाता है, और फिर 3मूल्यांकन किया जाता है और पूरे अल्पविराम अभिव्यक्ति के परिणाम के रूप में लौटा दिया जाता है, जो बाद में रिटर्न स्टेटमेंट द्वारा वापस किया जाता है ।


अभिव्यक्ति और विवरण के बारे में अतिरिक्त जानकारी

एक अभिव्यक्ति ऑपरेटरों और उनके ऑपरेंड का एक क्रम है, जो एक संगणना निर्दिष्ट करता है।

x = 2,3;है अभिव्यक्ति बयान , x = 2,3यहाँ अभिव्यक्ति है।

अर्धविराम के बाद एक अभिव्यक्ति एक बयान है।

वाक्य - विन्यास: attr(optional) expression(optional) ; (1)

return 2,3;है कूद बयान ( वापसी कथन ), 2,3अभिव्यक्ति यहाँ है।

वाक्य - विन्यास: attr(optional) return expression(optional) ; (1)


1
अच्छे खर्च। लेकिन क्या कुछ व्यावहारिक अनुप्रयोग हैं? या सिर्फ त्रुटियों को किया जाना है?
जीन फ़्राँस्वा Fabre

7
@ जीन-फ्रांस्वा फाबरे IMO यह सिर्फ भ्रामक है, बिल्कुल उपयोगी नहीं है।
गीतयुयानो सेप

11
मैंने इसे एक या दो बार forलूप में इस्तेमाल किया है जब, विचित्र रूप से, यह संख्यात्मक गणना में कोड को स्पष्ट कर सकता है ।
बाथशीबा

6
@ जीन-फ्रांकोइसफ्रे: जैसे बाथेशबा कहते हैं, यह इतना है कि आप i += 1, j += 2लूप के लिए कुछ लिख सकते हैं । किसी ने फैसला किया है कि सी ++ व्याकरण (या बल्कि सी व्याकरण, के बाद से इस हिस्से वहाँ से नकल किया गया था) काफी जटिल है पहले से ही परिभाषित करने के लिए अल्पविराम का पूर्वता काम की तुलना में अधिक है कि जब आप लिखने की कोशिश कर रहा बिना x = 2, 3लेकिन कम जब आप लिखते हैं x = 2, y = 3!
स्टीव जेसप Steve

1
@ होलगर: सेमीकोलन एक बयान को समाप्त करता है, यह एक ऑपरेटर नहीं है। यह एक ऐसी बात है जिसका उत्तर अधिक स्पष्ट करने के लिए दिया जा सकता है। "x = 2, 3" 2 ऑपरेटरों के साथ एक अभिव्यक्ति है, और (;;) के लिए समर्थन के कारणों के लिए, = उच्च पूर्वता है। (जैसा कि बाकी सभी ने कहा।) लेकिन "वापसी 2, 3;" एक कथन है जिसमें "2, 3" अभिव्यक्ति है। कुंजीशब्द "वापसी" के लिए तकनीकी रूप से कोई पूर्वधारणा नहीं है । (हालांकि प्रभावी रूप से , चूंकि यह कथन का हिस्सा है जो अभिव्यक्ति को स्वीकार करता है, यह अभिव्यक्ति में किसी भी ऑपरेटर की तुलना में अंतिम - निम्न "पूर्वता" है ।)
मीका बर्जर

32

अल्पविराम (जिसे अभिव्यक्ति पृथक्करण के रूप में भी जाना जाता है ) संचालक का मूल्यांकन बाएँ से दाएँ किया जाता है। के return 2,3;बराबर है return 3;

के मूल्यांकन x = 2,3;है (x = 2), 3;की वजह से ऑपरेटर पूर्वता । मूल्यांकन अभी भी बाएं से दाएं है, और संपूर्ण अभिव्यक्ति का मान 2 के साइड-इफेक्ट के साथ xमान 3 है।


2
क्या आप कृपया अभिव्यक्ति जुदाई ऑपरेटर पर अधिक संपादित और विस्तृत कर सकते हैं ? जैसा कि मैंने @ songyuanyao के उत्तर पर एक टिप्पणी में उल्लेख किया है, मैं समझ सकता हूं कि क्यों return 2,3और return (2,3)समान हैं। मेरा मानना ​​था कि पूर्व होना चाहिए (return 2),3
xyz

@BiagioFesta उस हिस्से को अच्छी तरह से समझाता है।
बाथशीबा

1
@ prakharsingh95 return 2एक कथन है (जैसे कि उनके द्वारा गठित for,while,if), अभिव्यक्ति नहीं। आप जैसे नहीं लिख सकते हैं f(return 2)या 2+return 2। इसलिए, (return 2),3वाक्यविन्यास अमान्य है।
चि।

@ हाँ, आप सही हैं। मैं मतलब मैं उम्मीद कर रहा था return 2, 3किए जाने की व्याख्या के रूप में (return 2), 3
xyz

2
C ++ के व्याकरण के अनुसार @ prakharsingh95, returnकेवल निम्नलिखित मामलों में हो सकता है: (ए) return अभिव्यक्ति_टॉप ; , और (बी) return लट में-इन-सूची ;
MM

20

यह कथन:

  x = 2,3;

दो भावों से बना है :

> x = 2
> 3

चूंकि ऑपरेटर पूर्वता , =कॉमा की तुलना में अधिक पूर्वता है ,, इसलिए x = 2मूल्यांकन किया जाता है और उसके बाद 3 । तब के xबराबर होगा 2


इसके returnबजाय:

int f(){ return 2,3; }

भाषा वाक्य रचना है:

return <expression>

नोट return अभिव्यक्ति का हिस्सा नहीं है।

तो उस स्थिति में दो अभिव्यक्ति का मूल्यांकन किया जाएगा:

> 2
> 3

लेकिन केवल दूसरा ( 3) लौटाया जाएगा।


2
UV'd। यदि आप <expression>स्पष्ट रूप से वैकल्पिक (व्याकरण के दृष्टिकोण से) के रूप में चिह्नित करते हैं, तो बहुत अयोग्य, लेकिन अच्छा होगा ।
बथशेबा

2
के पार्स ट्री में 5 भाव हैं x=2,3। दोनों शाब्दिक 2और 3पार्स पेड़ के नीचे हैं, जैसा कि पहचानकर्ता है x। ये सभी व्यक्तिगत रूप से मान्य अभिव्यक्ति हैं। ऑपरेटर पूर्वता का मतलब है कि पार्स पेड़ में कम= होता है , और दो अभिव्यक्तियों और चौथे अभिव्यक्ति को जोड़ती है । अंत में, पांचवीं अभिव्यक्ति कॉमा ऑपरेटर द्वारा अपने दो पक्षों में शामिल होकर बनाई जाती है और । हालाँकि, आप गलत तरीके से कहते हैं कि ऑपरेटर पूर्वता मूल्यांकन के क्रम को निर्धारित करता है । यह नहीं है मूल्यांकन का क्रम अनुक्रमण नियमों द्वारा निर्धारित किया जाता है। x2x=2x=23
MSalters

2
मैंने यह उल्लेख करने के लिए मतदान किया कि वापसी एक अभिव्यक्ति का हिस्सा नहीं है
डैनियल जर्स 14

@MSalters मैं आपसे सहमत हूँ, लेकिन मैं सिर्फ गलत तरीके से शब्द "का इस्तेमाल किया क्योंकि " के बजाय " के बाद से "। कुछ मेरी अंग्रेजी इतनी सही नहीं है! ; - =
बियागियो फेस्टा

2
क्या "मैक्रो-एक्सप्रेशन" यहां एक तकनीकी शब्द है? ऐसा लगता है जब पूर्वप्रक्रमक सामान के अर्थ में "स्थूल भाव" भी इसका उपयोग करने के लिए थोड़ा भ्रमित होता है।
सेंसहिन

2

कोष्ठक के साथ पूर्वता को उजागर करते हुए सरलीकृत दृष्टिकोण को लागू करने का प्रयास करें:

( x = 2 ), 3;

return ( 2, 3 );

अब हम बाइनरी ऑपरेटर को देख सकते हैं "," दोनों पर एक ही तरीके से काम करना, बाएं से दाएं।


1
मुश्किल हिस्सा साकार कर रहा है कि x = 2, 3अपने आप में एक अभिव्यक्ति है थोड़ी देर के लिए returnयह है return <expression>। तो आप उन्हें के रूप में पढ़ा (x = 2, 3)और (2, 3)
xyz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.