2013-08-26 34 views
5
int main(void) 
{ 
    int a=0, b=20; 
    char x=1, y=10; 
    if(a,b,x,y) 
    printf("bye"); 
    return 0; 
} 

उपरोक्त कोड में "if" स्थिति कैसे काम करती है? क्या "वाई" का मान केवल "अगर" द्वारा माना जाएगा?अगर (ए, बी, सी, डी) यह कैसे काम करता है?

+0

पढ़ने http: // stackoverflow।कॉम/प्रश्न/17785206/क्यों-करता-यह-सी-कोड-संकलन-क्या-करता-यह-करता/17785232 # 17785232 –

+0

उत्तर स्वीकार करना शुरू कर देता है। – Tirth

उत्तर

17

हां, अल्पविराम ऑपरेटर का मूल्य सही संचालन है। चूंकि किसी अन्य ऑपरेंड के दुष्प्रभाव नहीं होते हैं, इसलिए यह if (y) तक उबाल जाता है।

+0

इसका मतलब यह है कि, यदि ए, बी, सी 'झूठा' होगा, तब भी यह सीधे वाई पर जायेगा? –

+4

@ दीपांशु नो, [अल्पविराम ऑपरेटर] (http://en.wikipedia.org/wiki/Comma_operator) पिछले किसी को छोड़कर किसी भी ऑपरेंड के मूल्य की परवाह नहीं करता है। उनका मूल्यांकन किया जाता है और परिणाम फेंक दिया जाता है, कोई [शॉर्ट-सर्किट मूल्यांकन] नहीं होता है (http://en.wikipedia.org/wiki/Short-circuit_evaluation) हो रहा है। – unwind

+0

शायद। यदि आप उनमें से कुछ या उन सभी का उपयोग करना चाहते हैं, तो '(' और ')' के साथ '&&' या '||' का उपयोग करें। – haneefmubarak

6

Wikipedia से:

C और C++ प्रोग्रामिंग भाषाओं में, अल्पविराम ऑपरेटर (टोकन के प्रतिनिधित्व वाले,) एक द्विआधारी ऑपरेटर कि अपनी पहले संकार्य मूल्यांकन करता है और परिणाम को छोड़ देता है, और उसके बाद मूल्यांकन करता है दूसरा ऑपरेंड और इस मान (और प्रकार) को लौटाता है।

इसका असर यह है कि केवल अंतिम ऑपरेंड का सच्चाई के लिए मूल्यांकन किया जाता है, पिछले ऑपरेटरों के परिणाम त्याग दिए जाते हैं।

if(a,b,x,y) में केवल y की सच्चाई माना जाता है और इसलिए जो कुछ भी y का मूल्यांकन किया गया है के रूप में सही/गलत विचार किया जाएगा करने के लिए।

अपने मामले y में 10 जो सी में true माना जाता है, के बराबर इसलिए if जांच भी true करने का मूल्यांकन करेंगे और if ब्लॉक दर्ज किया जाएगा।

आप अपने उपयोग (और दुरुपयोग) के लिए StackOverflow पर this very popular question पर विचार करना चाहेंगे।

+2

मुझे लगता है कि यह केवल उचित है कि एक प्रश्न जो अनुसंधान की कमी के लिए सही रूप से बंद होना चाहिए विकिपीडिया से एक जवाब मिलता है। –

4

, (अल्पविराम) ऑपरेटर अभिव्यक्ति को अलग करता है। यदि कई मान राउंड ब्रैकेट में संलग्न होते हैं तो राउंड ब्रैकेट में अंतिम मान चर को आवंटित किया जाता है।

e.g a=(x,y,z); 
then a=z; 

जबकि अगर,

a=x,y,z; 

तो अभिव्यक्ति ऊपर (a=x);

कृपया उल्लेख this के लिए मूल्यांकन किया जाता है।

+1

अल्पविराम ऑपरेटर की कम से कम प्राथमिकता है। – ajay

+2

@YuHao बेशक यह संकलित होगा ... यह ए, वाई, और जेड को परिभाषित करता है, जो प्रारंभ होता है। संकलन नहीं करेगा 'int (a = x), y, z; ', यह उत्तर गलत बना रहा है। आरएस के लिए .: अल्पविराम अभिव्यक्तियों में केवल एक ऑपरेटर है। '(x, y, z)' प्रारंभिक अभिव्यक्ति है, इसलिए अल्पविराम वहां एक ऑपरेटर है। लेकिन घोषणाएं अभिव्यक्ति नहीं हैं, इसलिए 'int (a = x), y, z; 'बकवास है और आपके उत्तर का वह हिस्सा दोहराया जाना चाहिए। –

0

Joey के रूप में कहा ऊपर यह कुछ भी नहीं करने के लिए मूल्यांकन करता है और अधिक से अधिक

if (y) 
    .... 

यह निरीक्षण करने के लिए है कि यदि आपके कोड पढ़ा था महत्वपूर्ण है:

int main(void) 
{ 
    int a=0, b=20; 
    char x=1, y=10; 
    if(a++,b++,x++,y) 
    printf("%d, %d, %d, %d\n", a, b, (int)c, (int)y); 
    return 0; 
} 

उत्पादन हो गया होता

1, 21, 2, 10 

सभी वेतन वृद्धि निष्पादित की गई थी लेकिन टी के मूल्यांकन के प्रयोजनों के लिए वह हालत

(a++,b++,x++,y) 

केवल एक ही है कि मायने रखती है पिछले एक है, अर्थात् y

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