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




operators lvalue (2)

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

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++); रूप में पार्स किया जाता है int b = ++(i++); और i एक प्रतिद्वंद्विता है। इसलिए त्रुटि।

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

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

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

प्रश्न: क्यों (++i) एक lvalue जब i नहीं i ?

धन्यवाद!

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

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

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

    int b = ++i++;

            ^ ~~~

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


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

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


यह घोषणा

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)++;

अमान्य है।





pre-increment