2011-09-21 20 views
31

मैं प्रत्यक्ष असाइनमेंट और त्रिगुट सशर्त ऑपरेटरों पूर्वता लेकर संदेह में हूँ:त्रिगुट सशर्त और असाइनमेंट ऑपरेटर पूर्वता

#include<stdio.h> 
int main(void) 
{ 
    int j, k; 

    j = k = 0; 
    (1 ? j : k) = 1; // first 
    printf("%d %d\n", j, k); 

    j = k = 0; 
    1 ? j : k = 1; // second 
    printf("%d %d\n", j, k); 
    return 0; 
} 

मैं उत्पादन होने की अपेक्षा करेंगे:

1 0 
1 0 

लेकिन यह होने वाला:

1 0 
0 0 

प्लस मैं इस चेतावनी मिलती है:

main.cpp: 20: चेतावनी: बयान कोई प्रभाव नहीं

लाइन मैं दूसरे के रूप में टिप्पणी की है के बारे में जो है।

चूंकि प्रत्यक्ष असाइनमेंट ऑपरेटर के पास टर्नरी सशर्त ऑपरेटर की तुलना में कम प्राथमिकता है, इसलिए मुझे उम्मीद थी कि रेखाएं पहले और दूसरे के बराबर होंगी। लेकिन हां यह मामला नहीं है।

मैंने कोशिश की इस के साथ जी ++ --version (उबंटू 4.4.3-4ubuntu5) 4.4.3

+4

सी ++ एक चमत्कार है, या एक जानवर है? इसके साथ मेरे जीवन प्रोग्रामिंग के आधे खर्च करने के बाद भी मुझे इस तरह के सरल अभिव्यक्तियों के अर्थ को नहीं जानकर पकड़ा जा सकता है। मुझे इसे मानक में देखना था। – Suma

उत्तर

18

C/C++ भाषा में ऑपरेटर पूर्वता परिभाषित नहीं में एक टेबल या संख्या से, लेकिन एक व्याकरण द्वारा। सशर्त ऑपरेटर के लिए व्याकरण C++0x draft अध्याय 5.16 सशर्त ऑपरेटर [expr।cond]:

 
conditional-expression: 
    logical-or-expression 
    logical-or-expression ? expression : assignment-expression 

this one तरह पूर्वता तालिका इसलिए सही है जब आप doublecolon की बाईं ओर काम का उपयोग है, लेकिन जब सही पक्ष पर इस्तेमाल नहीं किया। इस असमानता का कारण क्या है मुझे कोई जानकारी नहीं है। यह एक ऐतिहासिक कारण हो सकता है: सी में सशर्त परिणाम लालसा नहीं था, इसलिए इसे कुछ निर्दिष्ट करने का कोई मतलब नहीं था, और उस समय कोष्ठक के बिना असाइनमेंट को स्वीकार करने की इजाजत दी जा सकती थी।

+1

लिंकन तालिका (वह समूह?: और = एक साथ) कोलन के दाईं ओर गलत क्यों है? – foxcub

+2

@foxcub तालिका का वर्तमान संस्करण सही है। असाइनमेंट की प्राथमिकता समान है क्योंकि तालिका में सशर्त और साझेदारी को छोड़ने का अधिकार है, जिसके परिणामस्वरूप सशर्त से पहले असाइनमेंट सही तरीके से किया जा सकता है। तालिका [उत्तर के समय गलत थी] (http://en.cppreference.com/mwiki/index.php?title=cpp/language/operator_precedence&oldid=5400), असाइनमेंट के लिए सशर्त के लिए उच्च प्राथमिकता बताते हुए। – Suma

+0

सी ++ वाक्यविन्यास को सिंटैक्टिक व्याकरण के रूप में परिभाषित किया गया है, लेकिन यह व्याकरण एक साधारण प्राथमिकता तालिका के अनुरूप होने के लिए डिज़ाइन किया गया है। आप कहते हैं कि तालिका "कोलन के बाईं तरफ इस्तेमाल होने पर गलत है", लेकिन उस तर्क से प्राथमिकता भी गलत होती है जब 'ए' बी [सी] 'जैसे अभिव्यक्ति में'] के बाईं ओर उपयोग किया जाता है। । एक प्राथमिकता तालिका का दावा यह है कि * दो ऑपरेटरों द्वारा देखी गई उप-अभिव्यक्ति जहां वे अपेक्षा करते हैं कि एक ऑपरेंड उच्च प्राथमिकता वाले किसी को दिया जाता है (और सहयोगीता से संबंध टूट जाते हैं)। * ​​इस दावे का उल्लंघन कभी नहीं किया जाता है। '?:' और '=' बस एक ही प्राथमिकता है। – Museful

14

दूसरी पंक्ति के बराबर है:

1 ? (j) : (k = 1); 

वह उसी के रूप में:

j; 

वह उसी के रूप में:

; 

कुंजी यह है कि टर्नरी सशर्त ऑपरेटर के दो ऑपरेशंस अभिव्यक्ति हो सकते हैं, इसलिए ऑपरेटर प्राथमिकता यहां प्रासंगिक नहीं है। यह बस इतना है कि दूसरा ऑपरेंड असाइनमेंट अभिव्यक्ति k = 1 है।

+0

* नोड * ऑपरेटर प्राथमिकता के साथ समस्या कुछ भी नहीं है - यह वह है?: एक शॉर्ट-सर्किट ऑपरेटर है। –

+0

@ काज़ड्रैगन: मैंने स्पष्ट किया कि - कुंजी यह है कि ऑपरेंड अभिव्यक्तियां हैं, इसलिए दूसरा ऑपरेंड संपूर्ण असाइनमेंट अभिव्यक्ति है। (सभी मानक लॉजिकल बाइनरी ऑपरेटर कम-सर्किट होते हैं। शॉर्ट-सर्किटिंग सशर्त के मूल्यांकन को संदर्भित करती है, परिणामस्वरूप बयान नहीं।) –

+6

आप सही हैं, लेकिन सवाल यह है: यह 1 के बराबर क्यों है? (जे): (के = 1); और नहीं (1? जे: के) = 1, जब एक सशर्त असाइनमेंट की तुलना में उच्च प्राथमिकता माना जाता है? – Suma

4

दूसरे मामले में,

1 ? j : k = 1; 

के रूप में मूल्यांकन किया जाता है:

(1) ? (j) : (k = 1); 

और के बाद से एक true को मूल्यांकन करता है, अभिव्यक्ति j जो कुछ नहीं करता है के लिए मूल्यांकन करता है।

9
(1 ? j : k) = 1; 

, के बराबर है

if(true) j = 1; 
else k = 1; 

और,

1 ? j : k = 1; 

के बराबर है,

if(true) j; // warning: statement has no effect 
else k = 1; 
+1

+1 हाइलाइट करने के लिए चेतावनी क्यों होती है। – larsmoa

संबंधित मुद्दे