ऐसा क्यों होता है यदि कथन, एक असाइनमेंट और समानता की जांच के साथ, गलत का मूल्यांकन करते हैं?


105

जब एक असाइनमेंट और एक समानता चेक -d एक साथ हो तो स्टेटमेंट कैसे काम करता है OR??

public static void test() {
    boolean test1 = true; 
    if (test1 = false || test1 == false) {
        System.out.println("TRUE");
    } else {
        System.out.println("FALSE");
    }       
}

यह मुद्रण FALSE क्यों है?


1
भागो और जांच करो। देखें कि क्या बूलियन मूल्य मुद्रित है यदि आप गलत असाइन करते हैं और यदि आप सच असाइन करते हैं। फिर कैसे या काम करता है पर पढ़ें।
प्रतीक

2
मैं बताना चाहूंगा कि डीबग मोड पर यह कोड TRUE मान देता है और रनिंग मोड पर FALSE मान देता है ... ऐसा क्यों है ??? ... (यदि मैंने अपनी शर्त को इस शर्त पर रखा है) ...
CoderNeji

test1=false, test1==falseहै false, false || falseहै false or falseहै जो false
जारेड बुरोज

मुझे पता है कि आप सलाह के लिए नहीं पूछ रहे थे, लेकिन नीचे दिए गए जवाबों के रूप में एक पूर्वगामी मुद्दे की पहचान करें, यहां कुछ ऐसे अभ्यास हैं जिन्होंने मुझे परेशानी से बचने में मदद की है (जब मैं इनसे चिपक जाता हूं): (1) हमेशा 100% न होने पर कोष्ठक का उपयोग करें अन्य डेवलपर्स की मदद करने के लिए पूर्ववर्तीता या आसान सुगमता के लिए कुछ। मान लें कि दूसरों को सभी ऑपरेटरों के लिए पूर्वता के नियम याद होंगे (2) यदि असाइनमेंट को आम तौर पर भ्रम को कम करने से बचा जाना चाहिए, तो बहुत सरल अगर-शर्तों को छोड़कर। कुछ सामान्य अपवाद हैं (विशेष रूप से I / O, नेटवर्किंग, आदि के लिए सरल जांच के साथ)। केवल मेरे दो सेंट्स।
रिमस्की

क्योंकिtest1 = true
जोनो

जवाबों:


189

अभिव्यक्ति आपके सोचने के तरीके को पार्स नहीं करती है। यह

(test1=false) || (test1 == false)

किस मामले में परिणाम होगा true, लेकिन

test1 = (false || test1 == false)

false || test1 == falseअभिव्यक्ति का मूल्य पहले गणना है, और यह है false, क्योंकि गणना में जाने के test1लिए निर्धारित है true

कारण यह इस तरह से पार्स किया गया है वह यह है कि पूर्वता की ||की तुलना में कम है ==ऑपरेटर, लेकिन असाइनमेंट ऑपरेटर की पूर्वता की तुलना में अधिक =


2
+1 @ रोहनफर्नांडो, कृपया यह भी ध्यान दें कि यदि आप असाइनमेंट के चारों ओर कोष्ठक को इस तरह जोड़ेंगे: ((test1 = false) || test1 == false)समग्र मान होगा true
अर्नोन ज़िल्का

1
कृपया कारण लिखें कि पार्सिंग ऐसा क्यों होता है ... क्या यह ऑपरेटरों के प्राथमिकता क्रम के कारण है?
कोंडू

3
@ कोंडू यह एक उचित अनुवर्ती सवाल है, मैंने एक पूर्ववर्ती तालिका के लिए एक लिंक जोड़ने के लिए संपादित किया, जो दिखाता है कि ==ऊपर है ||, लेकिन =नीचे है ||
dasblinkenlight

अंतिम पैराग्राफ भ्रामक है, इस अर्थ में यह समझने के लिए कि पहले के बजाय दूसरा पार्सिंग क्यों चुना गया है, यह (आसानी से याद किया गया) नियम जानने के लिए पर्याप्त है कि असाइनमेंट में किसी भी गैर-असाइनमेंट ऑपरेटर (यहां ||) की कम पूर्वता है । के रिश्तेदार पूर्वता ||और ==पता चलता है कि पार्स है ही प्रासंगिक है नहीं के रूप में test1 = ((false || test1) == false)है, जो मुझे नहीं लगता कि किसी को भी यथोचित (वैसे कि रिश्तेदार पूर्वता उम्मीद होती है, या अधिक आम तौर पर उस करते ||, &&संबंधों की तुलना में कम पूर्वता है, भी करने के लिए आसान है याद रखें, चूंकि हर समय उपयोग किया जाता है)।
मार्क वैन लीउवेन

1
@MarcvanLeeuwen ||और ==बनाम की रिश्तेदार मिसाल ||और =बताते हैं कि यह (आम) मामले से अलग व्यवहार क्यों करता है a == b || c == d
हारून डफ़ोर

83

यह एक पूर्ववर्ती मुद्दा है, मूल रूप से। आप मान रहे हैं कि आपका कोड इसके बराबर है:

if ((test1 = false) || (test1 == false))

... लेकिन ऐसा नहीं है। यह वास्तव में इसके बराबर है:

if (test1 = (false || test1 == false))

... जो इसके बराबर है:

if (test1 = (false || false))

(क्योंकि test1है trueके साथ शुरू करने के लिए)

... जो इसके बराबर है:

if (test1 = false)

जो मान नियत falseकरने के लिए test1अभिव्यक्ति होने का परिणाम के साथ, false

ऑपरेटर वरीयता की एक उपयोगी तालिका के लिए ऑपरेटरों पर जावा ट्यूटोरियल देखें ।


2

कृपया परिचालकों की पूर्वता पर एक नज़र डालें

अभिव्यक्ति test1 = false || test1 == falseनिम्नलिखित चरण में मूल्यांकन करेगी।

STEP: 1- test1 = false || test1 == false // पूर्ववर्तीता ==उच्चतम है

STEP: 2- test1 = false || false // ऑपरेटर ||की पूर्वता अधिक होती है

चरण 3- test1 = false

चरण 4- false

चूंकि अभिव्यक्ति का बूलियन मूल्य गलत हो जाता है। इसलिए किसी अन्य कथन को निष्पादित किया जा रहा है।


-11

(test1 = false || test1 == false)झूठा लौटता है, क्योंकि दोनों झूठे हैं। (test1 = false || test1 == true)यह सत्य है क्योंकि उनमें से एक सत्य है


1
पूरी तरह से ग़लत। प्रश्न के दो उच्च गुणवत्ता वाले उत्तर प्राप्त करने के बाद आप ऐसी गलत सूचनाओं के साथ क्यों जवाब देंगे जो बताता है कि क्या होता है?
l4mpi

5
इतनी कम गुणवत्ता के दो उत्तर व्यक्तिगत रूप से लिखित टिप्पणियों के लायक नहीं हैं। आपको लगता है कि आपका जवाब बकवास है, है ना? यदि नहीं, तो जॉन और ब्लिंकलाइट द्वारा दो उत्तरों को ध्यान से पढ़ें।
l4mpi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.