क्यों (0 <5 <3) सही है?


348

मैं jsfiddle.net में चारों ओर खेल रहा था और मैं उत्सुक हूं कि यह क्यों सच है?

if(0 < 5 < 3) {
    alert("True");
}

तो यह करता है:

if(0 < 5 < 2) {
    alert("True");
}

लेकिन यह नहीं है:

if(0 < 5 < 1) {
    alert("True");
}

क्या यह क्वर्क कभी उपयोगी है?


12
क्या आप जानते हैं wtfjs.com ?
Harmen

1
हा! नहीं, मैंने ऐसा पहले कभी नहीं देखा था।
punkrockbuddyholly

आह, निहितार्थ रूपांतरणों की खुशियाँ।
जर्ग डब्ल्यू मित्तग

4
कभी उपयोगी है? संभवतः मोटापे के लिए। :-)
इकोडे ४४० २०

क्यों? इसके अलावा, कुछ भी उपयोगी है यदि आप केवल उन परिस्थितियों को पा सकते हैं जिनकी आवश्यकता है। सच है, यह एक बहुत कम अक्सर कई अन्य की तुलना में आवश्यक है, लेकिन कई बार, कुछ और दूर के बीच हालांकि वे हो सकते हैं, जहां यह नौकरी के लिए बिल्कुल उपकरण हो सकता है।
Tem_user_name

जवाबों:


440

संचालन के आदेश को (0 < 5 < 3)जावास्क्रिप्ट में व्याख्या की जाती है ((0 < 5) < 3)जो पैदा करता है(true < 3) और सच 1 के रूप में गिना जाता है, जिससे यह सच हो जाता है।

यह भी है कि (0 < 5 < 1)गलत रिटर्न, (0 < 5)सच्चा रिटर्न, जिसकी व्याख्या की जाती है 1, जिसके परिणामस्वरूप (1 < 1)


158
और क्योंकि जावास्क्रिप्ट पायथन नहीं है। :-)
रासना

1
आपने उत्तर दिया जबकि मैं अपने प्रश्न को जोड़ने के लिए संपादन कर रहा था if(0 < 5 < 1) == false। अब सब स्पष्ट है, धन्यवाद :)
punkrockbuddyholly

28
वास्तव में, पायथन एकमात्र ऐसी भाषा है जिसके बारे में मुझे पता है कि इस वाक्यविन्यास को मानते ((0 < 5) && (5 < 3))हैं, शायद अन्य भी हैं, लेकिन मैं उनके बारे में नहीं जानता।
एलन गिलेन्स

18
@ एलन: गणितज्ञ इसका एक और उदाहरण है।
19

2
IMHO जावास्क्रिप्ट को नंबर के साथ बूलियन की तुलना करने की कोशिश करते समय TypeError को उठाना चाहिए, क्योंकि इसका कोई मतलब नहीं है।
मिशाल पेरोलाकोव्स्की

63

मेरा अनुमान है क्योंकि 0 < 5सत्य है, और जो सत्य है, वह ढल true < 3जाता 1 < 3है।


7
यहां कोई कास्टिंग नहीं है। एक कास्ट एक ऑपरेटर है, जिसे प्रोग्रामर स्पष्ट रूप से एक प्रकार की जांच करने के लिए उपयोग करता है । यह एक बूलियन से पूर्णांक में अंतर्निहित रूपांतरण है।
एरिक्सन

4
@erickson, वास्तव में ... क्या हमें यहाँ शब्दार्थ पर लटका दिया जाना चाहिए?
कैफ़ीक नेक

2
एरिकसन के बारे में चिंता मत करो। मैं शब्दार्थ का भी दुरुपयोग करता हूं। :)
मतीन उल्हाक

9
किसी भी स्थिति में सही शब्द जबरदस्ती है । और हाँ, पूर्ण रूप से गलत होने के साथ एरिकसन आंशिक रूप से गलत है। एक जबरदस्ती किसी भी मामले में एक प्रकार की कास्ट है, भले ही आमतौर पर (लेकिन यह सिर्फ एक सम्मेलन है) आप स्पष्ट प्रकार के रूपांतरणों को व्यक्त करने के लिए "कास्ट" शब्द का उपयोग करते हैं। टाइप रूपांतरण == टाइप कास्टिंग।
जैक

1
सभी तरह से सोफिस्ट ... जवाब वैसे भी '
अकेला

21

शायद इसलिए कि trueऐसा माना जाता 1है

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true


10

आपके प्रश्न के अनुसार कि क्या यह क्वर्क कभी उपयोगी है: मुझे लगता है कि कुछ मामला हो सकता है जहां यह उपयोगी होगा (यदि संघनित कोड आपके बाद है), लेकिन इस पर भरोसा करना (सबसे अधिक संभावना है) आपके कोड की समझ को गंभीर रूप से कम कर देगा।

यह बड़े भावों के एक भाग के रूप में पोस्ट / प्री इंक्रीमेंट / डिक्रीमेंट का उपयोग करने जैसा है। क्या आप यह निर्धारित कर सकते हैं कि इस कोड का परिणाम एक नज़र में क्या है?

int x = 5;
int result = ++x + x++ + --x;

नोट: इस कोड के साथ, आप कभी-कभी भाषा और संकलक के आधार पर अलग-अलग परिणाम भी प्राप्त कर सकते हैं।

अपने लिए और अपने कोड को पढ़ने वाले अगले आदमी के लिए जीवन को आसान बनाना एक अच्छा विचार है । स्पष्ट रूप से लिखिए कि आप वास्तव में क्या करना चाहते हैं बल्कि तब होता है जब आप बूलियंस के निहितार्थ जैसे दुष्प्रभावों पर निर्भर होते हैं।


जिज्ञासा से बाहर, result18 है?
punkrockbuddyholly

5
@MrMisterMan: मैं जावास्क्रिप्ट के बारे में निश्चित नहीं हूं, लेकिन जावा और सी # में मूल्यांकन को दाएं से बाएं करने की गारंटी है, और परिणाम वास्तव में 18 है। कुछ भाषाओं में, जैसे कि सी और सी ++, कोई गारंटी नहीं है कि यह होगा बाएं से दाएं मूल्यांकन किया गया है, और आप अपने कंपाइलर द्वारा जोड़े गए अनुकूलन के आधार पर विभिन्न परिणामों के साथ समाप्त हो सकते हैं।
ज़ाच जॉनसन

9

प्रश्न के दूसरे भाग का उत्तर, "क्या यह क्वर्क कभी उपयोगी है?" शायद कोई नहीं है, जैसा कि एक पिछले उत्तर से पता चलता है, अगर यह वास्तव में भाषा (जावास्क्रिप्ट) का एक क्विक है जो कि सच 1 में डाली जाती है, लेकिन यह कि प्रोग्रामर सामान्य रूप से 1 और सच्चा (और 0 और गलत) के रूप में नहीं देखता है। वही चीज।

यदि आपके पास 1 सच होने और 0 झूठे होने का मानसिक मॉडल है, तो यह सभी प्रकार की अच्छी बूलियन तकनीकों की ओर जाता है जो बेहद उपयोगी, शक्तिशाली और प्रत्यक्ष हैं। उदाहरण के लिए, आप A> 100 के परिणाम के साथ सीधे एक काउंटर बढ़ा सकते हैं, जो कि A 100 से अधिक होने पर काउंटर को बढ़ाएगा। इस तकनीक को Java में क्विकर या ट्रिक के रूप में देखा जा सकता है, लेकिन किसी सरणी या कार्यात्मक भाषा में मुहावरेदार हो सकता है।

सरणी भाषा APL में एक क्लासिक उदाहरण एक सरणी में आइटमों की संख्या की गणना करना होगा जो 100 से अधिक हैं (कहते हैं):

+/A>100

अगर ए 5 आइटम सरणी 107 22 256 110 3 है तो:

A>100

5 आइटम बूलियन सरणी देता है:

१ ० १ १ १ ०

और इस बुलियन परिणाम को सम्‍मिलित करें:

+/1 0 1 1 0

अंतिम उत्तर देता है:

3

यह प्रश्न एक आदर्श उदाहरण है जहां यह तकनीक बहुत उपयोगी होगी, खासकर यदि समस्या यह निर्धारित करने के लिए सामान्यीकृत है कि क्या एम बूलियन मूल्यों में से एन सच है।

जांचें कि क्या कम से कम दो में से तीन बूलियन सच हैं


7

यह आसान है।

(0 < 5 < 3)

बाएं से दाएं शुरू करें इसलिए यह पहले 0 <5 का मूल्यांकन करता है। क्या यह सच है? हाँ। TRUE = 1 के बाद से, यह 1 <3. का मूल्यांकन करता है क्योंकि 1 1 3 से कम है, इसलिए यह सच है।

अब इसी के साथ

 (0 < 5 < 1)

क्या 0 5 से कम है? हाँ। इसलिए इसे TRUE करें जिसका अर्थ भी है 1. अब उस तथ्य को ध्यान में रखते हुए, यह (1 <1) का मूल्यांकन करता है। क्या 1 से कम 1 है? नहीं, इसलिए यह गलत है। बराबर होना ही है।


4

क्या यह ० <५ का मूल्यांकन कर रहा है जो १ के लिए १ लौटाएगा जब १ <३ जो सत्य है?

C # चाहते हैं कि आप इसे करें "ऑपरेटर '<' प्रकार के बूल और 'int' के ऑपरेंड पर लागू नहीं किया जा सकता है"


कभी-कभी मुझे गतिशील भाषाओं में C # की सख्ती याद आती है।
अरमान मैकहिटेरियन

4

मैं ओबज-सी में थोड़ी देर पहले इस में भाग गया था और इससे बहुत हैरान था। मुझे कुछ इस तरह से परिणाम चाहिए थे:

if(0 < 5  && 5 < 3) {
alert("True");}

निश्चित रूप से गलत है, इसलिए आपको "सच्चा" अलर्ट नहीं मिलेगा। खुशी है कि मैंने इसे पढ़ा, मुझे अब पता है कि क्यों।


4

अजगर के अलावा, कॉफीस्क्रिप्ट एक और भाषा है जो जंजीरों की तुलना का समर्थन करती है, इस प्रकार वेनिला जेएस में 3 < x < 10परिवर्तित हो जाएगी(3 < x && x < 10)



1

गणित ऑपरेटर के संचालन पर एक बूलियन ऑपरेंड एक नंबर देता है। यह जाँचने के लिए हम करते हैं

true + 1  which gives you 2.

तो 0 < 5, गणित ऑपरेटर (<) के साथ संचालित बूलियन (सच) एक नंबर लौटाएगा। इसलिए यह 1 <3 तक उबलता है जो लौटता हैtrue


1

क्योंकि 0 कम है तो 5 तो वह सही है, और डिफ़ॉल्ट रूप से सही कुछ भी शामिल है और 1 का मूल्यांकन किया जा सकता है जो अभी भी 3 से कम है जो फिर से सच है


0

अपने परिणामों को संख्या () के रूप में पुन: प्रकाशित करने का प्रयास करें

if(Number(0) < Number(5) < Number(3)) {
    alert("True");
}

या यह प्रयास करें:

if(Number(0) < Number(5) && Number(5) < Number(3)) {
    alert("True");
}

मैंने इसे गुगली कर दी क्योंकि मुझे मिल रहा था (3 >= 20) //returning trueऔर मुझे लगता है कि जावास्क्रिप्ट 3एक बूलियन के रूप में जांचने की कोशिश कर रहा था क्योंकि मुझे यह मूल्य उस elm.getAttribute();फ़ंक्शन से मिल रहा था जो console.log();स्ट्रिंग रूप में छपाई कर रहा था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.