2010-03-06 14 views
10

में भ्रमित हो रहा है मुझे पता है कि हम जावा में बयानों के रूप में असाइनमेंट ऑपरेटर का उपयोग नहीं कर सकते हैं क्योंकि हम किसी भी अन्य भाषाओं में उपयोग करते हैं।== और = "if" कथन

कि है

  int a; 

      if(a = 1) { } 

एक संकलन त्रुटि दे देंगे।

लेकिन निम्न कोड ठीक काम करता है, कैसे?

  boolean b; 

      if(b = true) { } 

संपादित करें: क्या यह नियम अपवाद है कि असाइनमेंट अगर कथन में उपयोग नहीं किया जा सकता है।

+6

यह एक बुरा विचार में लगातार पहले डालने की आदत में पाने के लिए नहीं है अपने बयान करता है, तो .... यही कारण है: अगर (सच == ख) {} और अगर (1 == एक) { } यह आदत गारंटी देता है कि यदि आप लिखते हैं = == के बजाय संकलक आपको स्मैक करेगा। –

+5

@ ओली: राय उस पर व्यापक रूप से भिन्न होती है। जहां तक ​​पठनीयता का सवाल है, यह * एक बुरा विचार है। इसके अलावा, यह जावा जैसी भाषाओं में कोई लाभ नहीं देता है क्योंकि यहां कोई भ्रम उत्पन्न नहीं हो सकता है। मेरा मतलब है, कोई भी कभी भी एक परीक्षण लिखता है जैसे 'अगर (ए == सच)', है ना? –

+0

@ कोनराड। आप जावा में सही हैं, लेकिन इस सी के लिए रीट्रेड जो PERL और कुछ अन्य भाषाओं में काम करता है, उसने मुझे कई बार बचाया है। –

उत्तर

37

क्योंकि असाइनमेंट का "परिणाम" मान असाइन किया गया है ... इसलिए यह अभी भी boolean अभिव्यक्ति दूसरे मामले में है। if अभिव्यक्तियों की स्थिति boolean अभिव्यक्ति होने की आवश्यकता है, जो कि दूसरे से संतुष्ट है लेकिन पहले नहीं। प्रभावी ढंग से, अपने दो स्निपेट हैं:

int a; 

a = 1; 
if (a) { } 

और

boolean b; 

b = true; 
if (b) { } 

यह है कि विस्तार से स्पष्ट है कि दूसरे संस्करण संकलन होगा पहला है लेकिन नहीं?

यह एक कारण है कि सही और गलत से तुलना न करें। इसलिए मैं के बजाय if (b) और if (b == false) के बजाय if (!b) लिखता हूं। b और cboolean चर हैं, भले ही एक टाइपो कोई समस्या पैदा कर सके, आपको अभी भी if (b == c के साथ समस्याएं आती हैं) मैं नहीं कह सकता कि यह मेरे साथ कभी हुआ है।

संपादित करें: अपना संपादन के जवाब -, और while छोरों आदि इतने लंबे समय के रूप में कुल मिलाकर हालत अभिव्यक्ति boolean है - सभी प्रकार के कार्य if बयान में इस्तेमाल किया जा सकता है। उदाहरण के लिए, आप हो सकता है:

String line; 
while ((line = reader.readLine()) != null) 
{ 
    // Do something with a line 
} 

जब मैं आमतौर पर परिस्थितियों में से बचने के दुष्प्रभाव, इस विशेष मुहावरा अक्सर ऊपर दिखाए गए उदाहरण के लिए, या InputStream.read प्रयोग करने के लिए उपयोगी है। असल में यह है "जबकि मैंने जो मूल्य पढ़ा है वह उपयोगी है, इसका इस्तेमाल करें।"

+3

क्या आप वाकई आखिरी उदाहरण में ब्रांड्स की एक अतिरिक्त जोड़ी हैं? मैंने सोचा कि जावा में असाइनमेंट की आखिरी प्राथमिकता है ... –

+2

@ कार्लोस: अच्छा पकड़। हो सकता है कि मैं जानबूझकर इसे डालने के लिए उपयोग कर रहा हूं कि मैंने कभी कोशिश नहीं की है :) –

+0

मैं आमतौर पर उस बेवकूफ के बारे में सोचता हूं (और इसका उपयोग तब होता है जब एनालेटर के पास अगला और अगले तरीकों के संदर्भ में होता है - यह मूल रूप से लागू होता है उन लोगों के संयोजन जो स्पष्ट रूप से एक इटरेटर नहीं हैं (और मुझे यकीन है कि पाठकों को बाद के संस्करणों में जोड़े गए इंटरफ़ेस का कार्यान्वयन करना होगा)। – Carl

10

if के लिए आपको एक अभिव्यक्ति की आवश्यकता है जो बूलियन का मूल्यांकन करता है। b = trueबूलियन परint का मूल्यांकन करता है क्योंकि असाइनमेंट हमेशा निर्दिष्ट मानों का मूल्यांकन करते हैं।

1

दूसरा कोड ठीक काम करने का कारण यह है क्योंकि यह 'बी' को सत्य का मान निर्दिष्ट कर रहा है, और फिर यह देखने के लिए तुलना कर रहा है कि बी सही है या गलत है या नहीं। इसका कारण यह है कि आप एक कथन के अंदर असाइनमेंट ऑपरेटर कर सकते हैं, और आप एक बूलियन के खिलाफ तुलना कर सकते हैं। यह (सच) करने जैसा ही होगा।

1

जावा में, आपके पास अंतर्निहित कास्टिंग नहीं है। तो गैर-बुलियन मूल्य या स्वचालित रूप से बूलियन में परिवर्तित नहीं होते हैं।

पहले मामले में, बयानों का नतीजा एक इंट है, जो गैर-बूलियन है, जो काम नहीं करेगा। आखिरी मामला, परिणाम बुलियन है, जिसका मूल्यांकन किसी कथन में किया जा सकता है।

1

नियम है कि "काम एक if बयान में नहीं किया जा सकता" नहीं है, लेकिन वे कहते हैं "if बयान में हालत प्रकार boolean का होना चाहिए"। एक असाइनमेंट अभिव्यक्ति असाइन किए जा रहे प्रकार के मान का उत्पादन करती है, इसलिए यदि आप boolean मान असाइन कर रहे हैं तो जावा केवल if कथन में असाइनमेंट की अनुमति देता है।

यह एक अच्छा कारण है कि शैली if (foo == true) से बचा जाना चाहिए, और इसके बजाय बस if (foo) लिखें।

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