"++ i ++" अमान्य क्यों है (++ i) ++ वैध है?


14

चलो निम्नलिखित कोड पर विचार करें:

int main() {
    int i = 2;
    int b = ++i++;
    return 3;
}

यह एक त्रुटि के साथ निम्नलिखित का संकलन करता है:

<source>: In function 'int main()':

<source>:3:16: error: lvalue required as increment operand

    3 |     int b = ++i++;

      |                ^~

यह मुझे उचित लगता है। पोस्टफ़िक्स वेतन वृद्धि उपसर्ग वेतन वृद्धि की तुलना में अधिक प्राथमिकता है, तो कोड के रूप में पार्स किया गया है int b = ++(i++);और iएक rvalue है। इसलिए त्रुटि।

आइए अब इस संस्करण पर विचार करें कि डिफ़ॉल्ट प्राथमिकताएँ ओवरराइड करने के लिए कोष्ठक के साथ:

int main() {
    int i = 2;
    int b = (++i)++;
    return 3;
}

यह कोड संकलित करता है और लौटता है। 3. अपने दम पर, यह मुझे उचित लगता है लेकिन यह पहले कोड के साथ विरोधाभास लगता है।

सवाल: जब (++i)एक क्यों नहीं है?lvaluei

धन्यवाद!

अद्यतन: ऊपर दिखाया गया त्रुटि संदेश gcc (x86-64 9.2) से था। यहाँ सटीक प्रतिपादन है: gcc के साथ त्रुटि

क्लेंग x86-64 9.0.0 में एक बहुत अलग संदेश है: क्लैंग के साथ त्रुटि

<source>:3:13: error: expression is not assignable

    int b = ++i++;

            ^ ~~~

जीसीसी के साथ, आपको यह धारणा मिलती है कि समस्या पोस्टफ़िक्स ऑपरेटर के साथ है और आप तब भटक सकते हैं, ++iजबकि ठीक iनहीं है, इसलिए यह सवाल नहीं है। क्लैंग के साथ यह स्पष्ट है कि समस्या उपसर्ग ऑपरेटर के साथ है।


यह मूल रूप से सी के साथ टैग किया गया था, यह निश्चित रूप से मान्य सी नहीं है
एंटिटी हवाला

वास्तव में क्षमा करें! मैंने मान लिया कि व्यवहार C में समान था ...
Bktero

जवाबों:


23

iऔर ++iदोनों लवलीन हैं, लेकिन i++एक प्रतिद्वंद्विता है।

++(i++)मान्य नहीं हो सकता है, क्योंकि उपसर्ग ++को लागू किया जा रहा है i++, जो एक प्रतिद्वंद्विता है। लेकिन (++i)++ठीक है क्योंकि ++iएक अंतराल है।

ध्यान दें कि सी में, स्थिति अलग है; i++और ++iदोनों प्रतिद्वंद्विता हैं। (यह इस बात का एक उदाहरण है कि लोगों को यह मान लेना बंद कर देना चाहिए कि C और C ++ के नियम समान हैं। लोग इन धारणाओं को अपने प्रश्नों में सम्मिलित करते हैं, जिन्हें तब अस्वीकार कर दिया जाना चाहिए।)


4

यह घोषणा

int b = ++i++;

के बराबर है

int b = ++( i++ );

पोस्टफ़िक्स इंक्रीमेंट ऑपरेटर वेतन वृद्धि से पहले ऑपरेंड का मान लौटाता है।

C ++ 17 स्टैंडर्ड (8.2.6 वृद्धि और गिरावट) से

1 एक पोस्टफिक्स ++ अभिव्यक्ति का मूल्य इसके ऑपरेंड का मूल्य है ... परिणाम एक प्रचलन है

जबकि एकतरफा वेतन वृद्धि संचालक अपनी वेतन वृद्धि के बाद वापस लौट जाता है। तो यह घोषणा

int b = (++i)++;

यह सही है। आप उदाहरण के लिए लिख सकते हैं

int b = (++++++++i)++;

C ++ 17 स्टैंडर्ड (8.3.2 वृद्धि और गिरावट) से

1 उपसर्ग ++ के ऑपरेंड को जोड़कर संशोधित किया जाता है। 1 ऑपरेंड एक परिवर्तनीय अंतराल होगा। ऑपरेंड का प्रकार cv बूल के अलावा एक अंकगणित प्रकार या पूरी तरह से परिभाषित ऑब्जेक्ट प्रकार के लिए एक सूचक होगा। परिणाम अद्यतन ऑपरेंड है; यह एक अंतराल है , और यह एक बिट-फ़ील्ड है अगर ओपेरा थोड़ा-क्षेत्र है ...।

ध्यान दें कि सी में दोनों ऑपरेटर लैवल्यू के बजाय एक मूल्य लौटाते हैं। तो सी में यह घोषणा

int b = (++i)++;

अमान्य है।


3

इसलिए कोड को int b = ++ (i ++) के रूप में पार्स किया गया है; और मैं एक प्रतिद्वंद्विता है।

नहीं i, एक प्रतिद्वंद्विता नहीं है। iएक अंतराल है। i++एक प्रतिद्वंद्विता है (विशिष्ट होने का भाव)।

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