2013-05-16 14 views
6

if कथन में इंटेजर्स की तुलना करते समय जावा को डबल बराबर चिह्न (==) की आवश्यकता क्यों होती है?जावा को डबल बराबर चिह्न की आवश्यकता क्यों होती है?

उदाहरण

if(x = 3.141) 
    System.out.println("x is equal to pi."); 

के लिए सही नहीं है, यह होना चाहिए

if(x == 3.141) 
    System.out.println("x is equal to pi."); 

मुझे पता है कि "==" पूर्णांकों और "=" एक पूर्णांक मान सेट करने के लिए किया जाता है की तुलना करने के लिए किया जाता है, लेकिन if कथन में क्यों यह सच रहता है?

क्या यह में एक वैरिएबल मान को असाइन करने की अनुमति है यदि कथन (या नया चर शुरू करें)?

क्या कोई कारण है कि कोई भी if कथन के अंदर कोई वैरिएबल एक नया मान असाइन करना चाहेगा (यदि ऐसा है तो कृपया एक उदाहरण दें)?

ऐसा लगता है कि पहले से ही एक जवाब होना चाहिए, लेकिन मैं यहां पर या Google का उपयोग करने में असमर्थ था, अगर यह एक डुप्लिकेट प्रश्न है तो कृपया मुझे बताएं और मैं इसे तुरंत हटा दूंगा।

उत्तर

9

अगर = कभी-कभी असाइनमेंट किया जाता है, और कभी-कभी तुलना करता है, तो आप किस संदर्भ में इसका उपयोग करते हैं, यह भ्रमित नहीं होगा?

यह एक बुरा विचार की तरह लगता है, और त्रुटियों को पेश करेगा।

प्लस, वर्तमान वाक्यविन्यास सी और सी ++ के साथ संगत है, इसलिए बहुत से लोग इससे परिचित हैं।

क्या कोई कारण है कि कोई भी किसी भी कथन के अंदर एक वैरिएबल को एक नया मान मानना ​​चाहेगा (यदि ऐसा है तो कृपया एक उदाहरण दें)?

यह while छोरों में बहुत आम है:

int b; 
while ((b=in.read()) != -1){ 
+0

क्या आप int कर सकते हैं। एक कथन में एक चर? – java

+1

मजेदार तथ्य: वीबी (और वीबी.नेट) ओवरलोड '=' दोनों असाइनमेंट और समानता के लिए। [वीबी] 'ए = बी = सी' == [जावा]' ए = बी == सी; '(नहीं [जावा]' ए = बी = सी; ')। – michaelb958

+0

@ michaelb958: लेकिन उनके पास '==' नहीं है, है ना? तो यह भी संगत है। – Thilo

1

नोट त्रुटि क्या संदेश आप if (x = 3.141) के लिए मिलता है, यह प्रकार त्रुटि (double से boolean में परिवर्तित नहीं हो सकता है)।

असाइनमेंट का प्रकार दोनों तरफ का प्रकार है; यदि असाइनमेंट का प्रकार बूलियन (if (x = true), या यहां तक ​​कि if (x = a.equals(b))) है, तो लिखना कानूनी है।

इसलिए इस स्थिति में boolean पर मान असाइन करना कानूनी है, तो आपको तुलना के लिए == का उपयोग करना होगा।

+0

'यदि असाइनमेंट का प्रकार बूलियन है (यदि (x = true)), तो लिखना कानूनी है। 'हालांकि यह सही है, यह संभवतः एक त्रुटि है। क्यों कोई असाइन करना चाहता है, फिर तुरंत परीक्षण करें? – nhahtdh

+1

@nhahtdh ने मेरा उदाहरण बदल दिया। मैं मानता हूं कि यह खराब शैली है, यद्यपि। –

1

क्या यह किसी कथन में वैरिएबल को मानने की अनुमति देता है (या एक नया चर शुरू करता है)?

हां। ऐसा करने के लिए एक आम मुहावरा है:

String line = null; 
while ((line = in.readLine()) != null) { 
    // do work 
} 

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

+0

और एक बयान में? मैं सेट और चर = दूसरे या int में नहीं कर सकता। एक चर के साथ एक प्रकार का त्रुटि हो रही है – java

+0

@ जावा: आप बस चर को सेट नहीं करते हैं। यदि आप चर का एक गुच्छा सेट करना चाहते हैं, तो आप लूप के दौरान इसे पहले कर सकते हैं। जब तक आप तुलना में असाइनमेंट को शामिल नहीं कर सकते, उदाहरण के लिए, तो आप समय की स्थिति में असाइनमेंट नहीं कर पाएंगे। उस ने कहा, अगर यह अप्राकृतिक और भ्रमित है तो ऐसी चीज लिखने के लिए खुद को मजबूर मत करो। – nhahtdh

+1

तो क्या आप '=' को सशर्त और बयानों में अलग-अलग व्यवहार नहीं करना चाहते हैं, बल्कि 'जबकि' और 'if' की स्थितियों के लिए अलग-अलग व्यवहार करना चाहते हैं? – Thilo

0

आप एक कथन में एक चर निर्दिष्ट कर सकते हैं। यह भी, यह वैसे ही काम करता है: = हमेशा असाइनमेंट है, और == हमेशा तुलना करता है।

1
= 

असाइनमेंट के लिए उपयोग किया जाता है।

== 

तुलना के लिए उपयोग किया जाता है।

क्या यह एक कथन में एक वैरिएबल मान को आवंटित करने की अनुमति है (या एक नया चर शुरू करें)?

हाँ इसकी अनुमति है।

+0

नए वैरिएबल को शुरू करने की अनुमति नहीं है, आईआईआरसी। इसे केवल – nhahtdh

+0

@nhahtdh में प्रारंभ करने की अनुमति नहीं है। असाइनमेंट है। – EyadMhanna

1

प्रोग्रामिंग भाषाओं 101 का इतिहास:

  • फोरट्रान दोनों के लिए = उपयोग करता है।
  • एल्गोल ने := को असाइनमेंट के लिए पेश किया और तुलना के लिए = का उपयोग किया। यह एक व्याकरण अस्पष्टता को हल करने के लिए आवश्यक था।
  • पास्कल ने पीछा किया।
  • पीएल/1 नहीं था।
  • मैं बी या BCPL के लिए नहीं बोल सकता, लेकिन समय हम सी मिल गया यह और तुलना के लिए कार्य के लिए === था, द्वारा फिर से एक व्याकरण अस्पष्टता
  • सी ++ पीछा हल करने सी
  • जावा कई मामलों में सी ++ का पालन किया इसमें एक भी शामिल है।

व्याकरण अस्पष्टता अभिव्यक्तियों में असाइनमेंट की अनुमति देने के कारण उत्पन्न होती है। आपके दावे के विपरीत, if (x = true) जावा में कानूनी है यदि x प्रकार बूलियन है।

1

== पहचान तुलनित्र है, जो दोनों वस्तुओं और प्राइमेटिव के लिए काम करता है। यह सवाल का जवाब देता है "दो चीजें वही चीज हैं"।

= असाइनमेंट ऑपरेटर है। यह बाईं तरफ के दाहिने तरफ का मान सेट करता है। ,

boolean b; 

if (b = true) // This compiles, but is a bug, because it sets b, not tests it 

जबकि अन्य प्रकार इस वाक्य रचना, boolean और Boolean कर के साथ संकलन नहीं होगा तो यह है कि यही कारण है कि निम्नलिखित पैटर्न की सलाह दी है है::

चीजें जब बूलियन्स के साथ अपने उदाहरण का उपयोग गाड़ी चालू कर सकते हैं

if (b) 
0

तो ..

= काम है, और == तुलना है, और यह ALW है इस तरह की चीजें, कोई फर्क नहीं पड़ता कि उनका उपयोग कहाँ किया जाता है।

और असाइनमेंट "घोषणा" के साथ अलग है। एक असाइनमेंट स्टेटमेंट का रिटर्न वैल्यू होता है, जबकि एक घोषणा नहीं होती है।इसलिए यदि आप () में () में boolean a = false लिख नहीं सकते हैं, लेकिन आप पहले घोषित किए जाने पर a = false लिख सकते हैं।

सभी असाइनमेंट कानूनी नहीं हैं। उदाहरण के लिए:

int index; 
if (index = str.indexOf("something")) { 
    ... 
} 

यह नहीं कानूनी है, क्योंकि String.indexOf(String) किसी पूर्णांक देता है, है जबकि if एक बूलियन की आवश्यकता है।

इसके अलावा, वहाँ "कानूनी" और "बनाने भावना" के बीच एक बड़ा अंतर है।

int index; 
if ((index = str.indexOf("something")) != -1) { 
    ... 
} 

यह कानूनी है, के रूप में != आपरेशन एक बूलियन देता है, और यह, समझ में आता है के रूप में मैं अगर str सबस्ट्रिंग "कुछ" शामिल हैं जाँच करना चाहते हैं;

हालांकि,

int index; 
boolean flag; 
if (flag = ((index = str.indexOf("something")) != -1)) { 
    ... 
} 

भी कानूनी, पिछले रिटर्न एक बूलियन के रूप में बयान के रूप में है, लेकिन यह समझ में नहीं आता है, क्योंकि != कथन पहले से ही एक बूलियन लौटाता है।

+0

कारण आप किसी शर्त में घोषणा का उपयोग नहीं कर सकते हैं क्योंकि वाक्यविन्यास इसे अनुमति नहीं देता है, क्योंकि 'घोषणा में वापसी मूल्य नहीं है'। – EJP

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