2010-01-28 18 views
10

के रूप में काम नहीं कर रहे हैं, तो मैं तीन बराबर चर की समानता स्थापित करने की कोशिश कर रहा हूं, लेकिन निम्न कोड स्पष्ट सही उत्तर प्रिंट नहीं कर रहा है जिसे इसे मुद्रित करना चाहिए। क्या कोई समझा सकता है कि संकलक आंतरिक रूप से दिए गए if(condition) को पार्स कर रहा है?दो '==' समानता ऑपरेटर एक ही 'अगर' स्थिति

#include<stdio.h> 
int main() 
{ 
     int i = 123, j = 123, k = 123; 
     if (i == j == k) 
       printf("Equal\n"); 
     else 
       printf("NOT Equal\n"); 
     return 0; 
} 

आउटपुट:

[email protected]:~$ gcc -Wall -pedantic calc.c 
calc.c: In function ‘main’: 
calc.c:5: warning: suggest parentheses around comparison in operand of ‘==’ 
[email protected]:~$ ./a.out 
NOT Equal 
[email protected]:~$ 

संपादित करें:

नीचे दिए गए जवाब से जा रहे हैं, निम्न कथन ठीक समानता ऊपर जाँच करने के लिए है?

if ((i==j) == (j==k)) 
+1

आप ((i == जे) && (जे == ट)) –

+0

आपका परीक्षण संपादित की जरूरत है 'मैं == j'' जे == k' जितना समान मान है । 'I = 1', 'j = 2',' k = 3' के लिए क्या होता है? अनुमान न लें, इसे समझने का प्रयास करें: उदाहरण के लिए, '1 == 2' का मान क्या है? –

+0

[जंजीर तुलना ऑपरेटर (x

उत्तर

21
if ((i == j) == k) 

    i == j -> true -> 1 
    1 != 123 

कि बचने के लिए:

if (i == j && j == k) { 

नहीं ऐसा करने के कार्य करें:

if ((i==j) == (j==k)) 

आप मिल जाएगा मैं = 1, जे = 2, कश्मीर के लिए = 1:

if ((false) == (false)) 

... इसलिए गलत जवाब;)

+0

कोडिंग जैसा है ((i == j) == (j == k)) ठीक है ??? –

+1

@ मणव, संख्या सशर्त के बीच उपयोग करें &&। – jmucchiello

+0

यह "ठीक है" लेकिन यह समझ में नहीं आता है। उस ने कहा "यदि' i' और 'j' की समानता' j' और 'k' की समानता के समान है।" सभी तीन अलग होने से यह सच हो जाएगा। आप '&&' चाहते हैं, जिसका अर्थ है और। – GManNickG

9

आप आपरेशनों को अलग करने की जरूरत है:

if (i == j && i == k) 
7

मैं संकलक की चेतावनी ध्यान और (i==j) && (j==k) के रूप में लिखते हैं। लिखने में अधिक समय लगता है लेकिन इसका मतलब एक ही बात है और संकलक शिकायत करने की संभावना नहीं है।

(i == j) == k 

के रूप में तो तुम j करने के लिए i तुलना और true मिल

+1

और यह और अधिक स्पष्ट है। पठनीयता महत्वपूर्ण है। –

+0

बस picky होने के लिए, संकलक वास्तव में चेतावनी दे रहा है कि आप * तुलना तुलना कर रहे हैं *। –

+0

हालांकि स्पष्ट रूप से इसका अर्थ मानव का इरादा है, यह संकलक का सुझाव नहीं बदला गया है। कंपाइलर की चेतावनी पर ध्यान देना आपको यह कोड देगा: '(i == j) == k'। –

8

अभिव्यक्ति

i == j == k 

पार्स किया गया है। true से 123 की तुलना में आप तुलना करें। true को पूर्णांक में 1 के रूप में परिवर्तित किया गया है। एक 123 के बराबर नहीं है, इसलिए अभिव्यक्ति झूठी है।

आप की जरूरत है अभिव्यक्ति i == j && j == k

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