2012-04-05 15 views
5

कोड का निम्न भाग पर विचार करें:सशर्त ऑपरेटर का वैध उपयोग?

if (i & 1) k = 99 - i; else m = 99 - i; 

मेरे संकलक शिकायत नहीं है और कोड के इस टुकड़े को क्रियान्वित करने देता है:

int i, k, m; 
k = 12; 
m = 34; 
for (i = 0; i < 2; i++) ((i & 1) ? k : m) = 99 - i; 
printf("k: %ld m: %ld\n\n", k, m); 

इस मूर्खतापूर्ण उदाहरण में, सशर्त ऑपरेटर अभिव्यक्ति के लिए एक शॉर्टकट है अपेक्षित आउटपुट

k: 98 m: 99 

मेरा प्रश्न, हालांकि, यह सी मानक के अनुसार मान्य कोड है? मैंने पहले कभी भी ऐसा कुछ नहीं देखा है।

+0

हो जाता है। हालांकि, आपको खुद से पूछना चाहिए कि क्या आप इस तरह के कोड को बनाए रखना चाहते हैं, खासकर यदि यह कुछ सालों तक छुआ नहीं है और आपको यह पता लगाना होगा कि सड़क पर 5 साल बाद आप क्या करते हैं। –

उत्तर

8

फ़ुटनोट 110 C11 मानक में:

सशर्त अभिव्यक्ति एक lvalue उपज नहीं है।

और 6.5.16 पैरा 2:

एक असाइनमेंट ऑपरेटर अपनी बाईं संकार्य के रूप में एक परिवर्तनीय lvalue होगा।

तो नहीं, वह कोड सी मानक के अनुरूप नहीं है।

सी ++ 11 में, यह मान्य है:

दूसरे और तीसरे ऑपरेंड lvalues ​​कर रहे हैं और एक ही प्रकार है, तो नतीजा यह है कि इस प्रकार का है और एक lvalue है।

तो यह उन धूलदार कोनों में से एक है जहां सी और सी ++ काफी भिन्न हैं। यदि आपका कंपाइलर कोई त्रुटि उत्पन्न नहीं करता है, तो मुझे लगता है कि आप एक सी ++ कंपाइलर का उपयोग "सी मोड" के साथ कर रहे हैं, उचित सी संकलक के बजाय; MSVC?

+1

मुझे लगता है कि यह मान्य सी ++ हालांकि है। – hugomg

+0

मैं इसे सी ++ कोड के रूप में संकलित कर रहा था, हां, एमएसवीसी ++ 6.0 के साथ "सी मोड" में नहीं। मैंने इसे सी मोड में संकलित करने की कोशिश नहीं की है। भले ही यह मान्य है, चाहे सी या सी ++ में, मैं इसका उपयोग करने का भी इरादा नहीं रखता; यह कुछ ऐसा था जो मैं आया था, जबकि मैं सोच रहा था कि प्रोग्राम को क्या करना है और मैं इसकी वैधता के बारे में उत्सुक हूं। आपके जवाब का धन्यवाद! – zarulad

+0

@zarulad: मदद करने में खुशी! –

1

यह सी में एक lval ++ के रूप में सशर्त उपयोग करने के लिए मान्य है, लेकिन नहीं सी

में

C++ (आईएसओ आईईसी 14882: 1998 (ई) 5.16.4)

तो दूसरा और तीसरे ऑपरेशंस lvalues ​​हैं और एक ही प्रकार है, परिणाम उस प्रकार का है और एक lvalue है।

संकेत आप सी में समान चाल का उपयोग करना चाहते हैं, तो आप का उपयोग करना चाहिए:

आईएसओ/आईईसी 9899: TC2, 6.5.14.6

दोनों दूसरे और तीसरे ऑपरेंड हैं पॉइंटर्स या एक शून्य सूचकांक स्थिर होता है और दूसरा सूचक होता है, परिणाम प्रकार एक प्रकार का सूचक होता है जो दोनों प्रकार के सभी प्रकार के क्वालीफायरों के साथ योग्य होता है।

*((i & 1) ? &k : &m) = 99 - i; 
+0

तब @StephenCanon के उद्धरण के बारे में क्या? –

+0

@ पवनमंजुनथ मैंने फिर से सी और सी ++ को भ्रमित कर दिया। मैंने इसे प्रतिबिंबित करने के लिए अपना उत्तर अपडेट किया। धन्यवाद! – dasblinkenlight

4

यह कानूनी सी नहीं है, और एक संकलक जो इसे स्वीकार करता है वह गलत है।हालांकि, अगर आप के साथ एक ही बात कर सकते हैं:

*((i & 1) ? &k : &m) = 99 - i; 

और यह संकलित करता है तथा अपेक्षा के अनुरूप है, तो यह सबसे अधिक संभावना वैध है कार्यान्वित अगर यह कानूनी सी