Int x {y = 5} क्यों संभव है?


10
int main() {
    int y;
    int x{ y = 5 };
    //x is 5
}

यह कैसे संभव है, चूंकि y = 5 एक गणना योग्य अभिव्यक्ति नहीं है?

इसके अलावा, कंपाइलर या आईडीई मुख्य के बारे में शिकायत क्यों नहीं करता () इंट वापस नहीं करता है?


8
y = 5 है एक अभिव्यक्ति है, और यह मूल्य है 5। आपको क्यों लगता है कि यह नहीं है?
बेकार

2
के लापता होने returnके संबंध में main, इस प्रश्न को देखें ।
अखरोट

3
बेहतर अभी तक, दूसरा सवाल हटा दें। प्रति प्रश्न एक एकल प्रश्न स्टैक ओवरफ्लो पर पसंदीदा मॉडल है।
स्टोरीटेलर - अनसलैंडर मोनिका

शायद आपको यह प्रश्न फिर से समझना चाहिए कि y = 5यहाँ 5 की पैदावार क्यों है। कुछ वापस करने के लिए असाइनमेंट ऑपरेटरों की संभावना वास्तव में C / C ++ की एक विचित्र विशेषता है।
user7860670

जवाबों:


11

मैं आपके अंतिम प्रश्न से शुरू करूंगा

इसके अलावा, कंपाइलर या आईडीई मुख्य के बारे में शिकायत क्यों नहीं करता () इंट वापस नहीं करता है?

सी ++ मानक के अनुसार (6.6.1 मुख्य कार्य)

5 मुख्य विवरण में रिटर्न स्टेटमेंट में मुख्य फ़ंक्शन को छोड़ने का प्रभाव होता है (स्वचालित भंडारण अवधि के साथ किसी भी ऑब्जेक्ट को नष्ट करना) और एसटीडी कॉल करना :: रिटर्न मूल्य के साथ तर्क के रूप में बाहर निकलें। यदि नियंत्रण मुख्य के यौगिक-बयान के अंत से बहता है, तो प्रभाव ऑपरेंड 0 के साथ वापसी के बराबर है (यह भी देखें 18.3)।

और इस सवाल के सापेक्ष

यह कैसे संभव है, चूंकि y = 5 एक गणना योग्य अभिव्यक्ति नहीं है?

C ++ स्टैंडर्ड (8.18 असाइनमेंट और कंपाउंड असाइनमेंट ऑपरेटर्स) से

1 असाइनमेंट ऑपरेटर (=) और कंपाउंड असाइनमेंट ऑपरेटर सभी ग्रुप को राइट-टू-लेफ्ट करते हैं। सभी को अपने बाएं ऑपरेंड के रूप में एक परिवर्तनीय अंतराल की आवश्यकता होती है और बाएं ऑपरेंड का जिक्र करते हुए एक अंतराल लौटाता है।

इस घोषणा को प्रायोजित करें

int x{ y = 5 };

समान रूप से दो बयानों में विभाजित किया जा सकता है

y = 5;
int x{ y };

इसके अलावा C ++ में आप निम्न तरीके से चर y का संदर्भ बना सकते हैं

int &x{ y = 5 };

यहाँ एक प्रदर्शन कार्यक्रम है

#include <iostream>

int main() 
{
    int y;
    int &x{ y = 5 };    

    std::cout << "y = " << y << '\n';

    x = 10;

    std::cout << "y = " << y << '\n';
}

इसका आउटपुट है

y = 5
y = 10

आप यह घोषणा कर सकते हैं

int x{ y = 5 };

फिर से लिखना भी पसंद करते हैं

int x = { y = 5 };

हालाँकि इस बात पर ध्यान दें कि इन दोनों के बीच अंतर है (उपरोक्त घोषणाओं के समान ही) दो घोषणाएँ।

auto x{ y = 5 };

तथा

auto x = { y = 5 };

पहली घोषणा में चर xका प्रकार होता है int। दूसरी घोषणा में चर xका प्रकार होता है std::initializer_list<int>

अंतर को अधिक दृश्यमान बनाने के लिए देखें कि वस्तुओं के मूल्यों का उत्पादन कैसे किया जाता है।

#include <iostream>

int main() 
{
    int y;
    auto x1 { y = 5 };  

    std::cout << "x1 = " << x1 << '\n';

    auto x2 = { y = 10 };   

    std::cout << "*x2.begin()= " << *x2.begin() << '\n';

    std::cout << "y = " << y << '\n';

    return 0;
}

कार्यक्रम का आउटपुट है

x1 = 5
*x2.begin()= 10
y = 10

16

यह कैसे संभव है, चूंकि y = 5 एक गणना योग्य अभिव्यक्ति नहीं है?

यह एक असाइनमेंट है, और असाइनमेंट यील्ड वैल्यूज, यानी "लेफ्ट ऑपरेंड के cv-अनक्वालीफाइड टाइप", देखें [expr.ass / 3] । इसलिए, y = 5परिणाम y, जो कि 5इनिशियलाइज़ करने के लिए उपयोग किया जाता है x

अपने दूसरे प्रश्न के संबंध में, मुख्य पर संदर्भ देखें (या [basic.start.main / 5] ):

मुख्य फ़ंक्शन के शरीर को returnकथन को शामिल करने की आवश्यकता नहीं है : यदि नियंत्रण किसी returnबयान का सामना किए बिना मुख्य के अंत तक पहुंचता है , तो प्रभाव निष्पादन का है return 0;

इसलिए, संकलक या आईडीई आपको एक गलत returnबयान के बारे में चेतावनी देता है जो अंत में mainगलत होगा। जाहिर है , तथ्य यह है कि आप हमेशा returnगैर- voidकार्यों से वस्तुओं को निष्पादितmain करना चाहिए एक तरह का है ... ठीक है, ऐतिहासिक कारण से मुझे लगता है।


2
एक अभिव्यक्ति एक मूल्य में परिणाम कर सकती है , लेकिन केवल एक फ़ंक्शन returnएक हो सकता है। -आर्थिक
बेकार

मुझे लगता है कि यह int x {y = 5}; कथन c
bhura

@bhura - सवाल C ++ का है, C का नहीं
StoryTeller - Unslander Monica

शायद उल्लेख के लायक है, भले ही आवश्यकता न हो, फिर भी मुख्य से मूल्य वापस करना अच्छा व्यवहार माना जाता है?
एकांकागुआ

4

operator=()एक मूल्य है, जो चर करने के लिए सौंपा मूल्य है में परिणाम है। इस वजह से, इस तरह से चेन असाइनमेंट करना संभव है:

int x, y, z;
x = y = z = 1;

काम अभिव्यक्ति एक है मूल्य । कार्यों में वापसी मूल्य हैं; भाव नहीं।
पीट बेकर

3

यदि आप cppreference पर प्रलेखन पर एक नज़र डालते हैं , तो आप देखेंगे कि operator=()उस ऑब्जेक्ट का एक संदर्भ लौटाया गया था जिसे असाइन किया गया था। इसलिए, असाइनमेंट का उपयोग उस अभिव्यक्ति के रूप में किया जा सकता है जो उस ऑब्जेक्ट को लौटाता है जिसे सौंपा गया था।

फिर, यह ब्रेसिज़ के साथ एक सामान्य असाइनमेंट है।

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