'और' बनाम '&&' ऑपरेटर के रूप में


297

मैं एक codebase जहां डेवलपर्स का उपयोग करने का फैसला किया है ANDऔर ORके बजाय &&और ||

मुझे पता है कि ऑपरेटरों की पूर्वता ( &&पहले जाती है and) में अंतर है , लेकिन दिए गए ढांचे ( PrestaShop के सटीक होने के साथ) यह स्पष्ट रूप से एक कारण नहीं है।

आपके द्वारा कौन सा संस्करण उपयोग किया जा रहा है? है andकी तुलना में अधिक पठनीय &&? या कोई अंतर नहीं है?


1
ध्यान दें कि ~बिट-वार नहीं ऑपरेटर और तार्किक नहीं है। ;-)
गोमबो

2
हाँ मैं जानता हूँ। बुरी आदतें :) । यह थोड़ा अजीब है कि PHP में 'और', 'या' और 'xor' हैं, लेकिन कोई 'नहीं' नहीं है, है ना?
टी.एस.

1
@ts: सही जवाब यहाँ आर Bemrose द्वारा प्रदान की एक है stackoverflow.com/questions/2803321/and-vs-as-operator/...
मार्को Demaio

4
! तार्किक नहीं ऑपरेटर है
रेजर स्टॉर्म

2
@chiliNUT काफी सही। उस समय यह समझ में आया होगा। लगता है कि इस बिंदु पर गलत गलत जवाब को दंडित किया गया है :)
doublejosh

जवाबों:


662

यदि आप उपयोग करते हैं ANDऔर OR, आप अंततः कुछ इस तरह से फंस जाएंगे:

$this_one = true;
$that = false;

$truthiness = $this_one and $that;

अनुमान लगाना चाहते हैं कि क्या $truthinessबराबरी है?

अगर तुमने कहा false... बज़ट, माफ करना, गलत!

$truthinessऊपर का मूल्य है true। क्यों? =की तुलना में एक उच्च मिसाल है and। निहित आदेश दिखाने के लिए कोष्ठकों को जोड़ने से यह स्पष्ट हो जाता है:

($truthiness = $this_one) and $that

यदि आप पहले कोड उदाहरण के &&बजाय उपयोग करते हैं and, तो यह अपेक्षित और जैसा होगा false

जैसा कि नीचे दिए गए टिप्पणियों में चर्चा की गई है, यह भी सही मूल्य प्राप्त करने के लिए काम करता है, क्योंकि कोष्ठक की तुलना में अधिक पूर्वता है =:

$truthiness = ($this_one and $that)

134
+1: इसे PHP प्रलेखन में ज़ोर से और स्पष्ट किया जाना चाहिए, या PHP को बदलना चाहिए और इन ऑपरेटरों को एक ही वरीयता देनी चाहिए या and orसभी के लिए एक बार DEPRECATE करना चाहिए । मैंने बहुत से लोगों को यह सोचते हुए देखा कि वे बिल्कुल एक जैसे हैं और यहाँ उत्तर अधिक प्रशंसापत्र हैं।
मार्को डेमायो

11
वास्तव में, अन्य भाषाओं (उदाहरण के लिए, पर्ल और रूबी) में भी ये संस्करण एक ही पूर्ववर्ती भेद के साथ होते हैं, इसलिए यह इस मानक से विचलन करने के लिए समझदार नहीं होगा (हालांकि यह शुरुआती के लिए हो सकता है) PHP में समान रूप से समान बनाकर। PHP अनुप्रयोगों के टन के पिछड़े संगतता का उल्लेख नहीं करने के लिए।
म्लादेन जेबलानोविक

23
किसी भाषा के लिए दस्तावेज़ पढ़ने में लोगों की अक्षमता भाषा के निर्णयों को गलत नहीं बनाती है। Mladen नोटों के रूप में, पर्ल और रूबी भी इन अतिरिक्त ऑपरेटरों का उपयोग करते हैं, और इसी तरह के उदाहरणों के साथ। यह इस तरह के निर्माण के लिए अनुमति देता है $foo and bar(), जो बयान के लिए अच्छा शॉर्टकट हैं। यदि अनपेक्षित व्यवहार (खराब प्रलेखन से, या इसे नहीं पढ़ना है) एक कारण था कि हम PHP का उपयोग करने के बारे में बात नहीं करेंगे।
Altreus

2
मैंने गलत लाइन खोजने के लिए 3 मिनट बिताए: $ यह = सत्य : ,( और क्या $ सत्यता के बारे में = ($ यह और $ कि); यह मेरे लिए बेहतर है :)
दिमित्री कोज़मेन्को

6
मैं दिमित्री से सहमत हूं - कोष्ठक में बूलियन मूल्यांकन लपेटने से कोड के इरादे को स्पष्ट करने में मदद मिलती है। मुझे लगता है कि ऑपरेटर और यह कार्य कर रहा है क्योंकि वे अब मौजूद हैं, अन्य भाषाओं के साथ मूल्यवान और सुसंगत हैं, भाषा को समझना प्रोग्रामर का काम है।
जॉन जेड

43

यह कैसे उपयोग किया जा रहा है, इसके आधार पर, यह आवश्यक हो सकता है और यहां तक ​​कि काम भी हो सकता है। http://php.net/manual/en/language.operators.logical.php

// "||" has a greater precedence than "or"

// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;

// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;

लेकिन ज्यादातर मामलों में ऐसा लगता है कि डेवलपर की स्वाद की चीज अधिक है, जैसे कि यह हर घटना है जो मैंने कोडइग्निटर ढांचे में देखा है जैसे @ सरफराज ने उल्लेख किया है।


2
यह ध्यान देने योग्य है कि "सही" को अनदेखा नहीं किया जाता है यदि वह अभिव्यक्ति एक बड़े बयान का हिस्सा है। मामले पर विचार करें if ($f = false or true) $f = true;- नतीजा यह होगा कि $fअंत में सच हो जाता है, क्योंकि अभिव्यक्ति का मूल्यांकन समग्र रूप से होता है।
क्रिस ब्राउन ने

1
नहीं, आप बस बाद में चर को ओवरवोट करते हैं। अभिव्यक्ति अभी भी झूठी का मूल्यांकन किया है, तो आप इसे अगली पंक्ति में सच के साथ लिखा था।
r3wt

2
असल में, वह सही था। सबसे पहले, $fझूठे को सौंपा जाता है - लेकिन स्थिति सच का मूल्यांकन करती है, इसलिए तब $fओवरराइट किया जाता है। यदि स्थिति का मूल्यांकन असत्य से किया जाता है, $fतो कभी भी इस तरह से अधिलेखित नहीं किया जाएगा।
अनुज १०

यह सुझाव देना हास्यास्पद है कि डेवलपर्स को अपने स्वयं के स्वाद का पालन करना चाहिए। उसी कोड को बनाए रखने का प्रयास करने वाले किसी अन्य डेवलपर की दुःस्वप्न को भूल जाओ, जो डेवलपर ने कोड लिखा था वह किसी भी कोड में लिखे गए शब्दार्थक गलतियां करेगा क्योंकि s / वह andअधिक पसंद करता है &&, जहां andकेवल कुछ स्थितियों &&में अपेक्षित रूप से काम करता है और सभी में अपेक्षित रूप से काम करता है। स्थितियों।
ADTC

13

सुरक्षा के लिए, मैं हमेशा अपनी तुलनाओं को छोटा करता हूं और उन्हें बाहर करता हूं। इस तरह, मुझे ऑपरेटर की प्रक्रिया पर भरोसा करने की ज़रूरत नहीं है:

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )

29
व्यक्तिगत रूप से मुझे लगता है कि अतिरिक्त अनावश्यक कोष्ठकों को जोड़ने से यह पढ़ने के लिए अधिक भ्रमित हो जाता है कि आपको क्या चाहिए। उदाहरण के लिए, मुझे लगता है कि यह पढ़ना बहुत आसान है: अगर (($ i == & & $ b == 2) || ($ c == 3 && $ f! = 5))
rooby

4
मुझे लगता है कि यह कोड का सबसे सुंदर टुकड़ा है जिसे मैंने पूरे दिन देखा है। बहुत बढ़िया।
rm-vanda

जैसा कि PHP एक व्याख्या की गई भाषा है यदि आप अपने कोड पर अनावश्यक व्हाट्सएप या नई लाइनों का उपयोग नहीं करते हैं तो यह तेजी से चलेगा। यदि आप एक संकलित भाषा पर ऐसा करते हैं तो केवल संकलन में अधिक समय लगेगा लेकिन यह रनटाइम पर प्रभाव नहीं डालेगा। मेरा मतलब यह नहीं है कि यह एक बार एक अंतर को चिह्नित करेगा, लेकिन php + जावास्क्रिप्ट का उपयोग करके एक पूरे आवेदन पर दोनों ने उदाहरण की तरह लिखा है ... लोड समय निश्चित रूप से बड़ा होगा। स्पष्टीकरण: व्हाट्सएप और नई लाइनों की अनदेखी की जाती है, लेकिन उन्हें अनदेखा करने के लिए, उन्हें जांचना होगा। यह संकलित लैंग्स पर रनटाइम पर होता है और जब एक संकलित पर संकलन होता है।
जोएलबॉनेट

@JoelBonetR यदि आप php opcache का उपयोग कर रहे हैं या लोड समय के बारे में आपकी चिंता अप्रासंगिक है। मुझे आशा है कि कोई भी इसके बिना एक उत्पादन php साइट नहीं चला रहा है ...
PeloNZ

@PeloNZ इसलिए आप गंदा लिख ​​सकते हैं क्योंकि इसे वैसे भी कैश किया जाएगा और पूरा प्रोजेक्ट ताज़ा होने पर लोड होने में केवल एक सेकंड का समय लगेगा? कोड को साफ करना अपने और अपने साथियों के लिए है, समय के बारे में केवल एक बिंदु था जिसे ज्यादातर लोग नजरअंदाज नहीं करते थे और न ही जानते थे।
जोएलबॉनेट

11

पूर्वता और & के बीच भिन्न होती है ( और (&& की तुलना में उच्च वरीयता होती है) और, कुछ ऐसा जो भ्रम पैदा करता है जब एक टर्नरी ऑपरेटर के साथ संयुक्त होता है। उदाहरण के लिए,

$predA && $predB ? "foo" : "bar"

जबकि एक स्ट्रिंग लौटेगा

$predA and $predB ? "foo" : "bar"

एक बूलियन वापस कर देगा ।


10

चूँकि आपके andपास पूर्ववर्ती स्थिति की तुलना में इसका कम =उपयोग है, इसलिए:

if ($var = true && false) // Compare true with false and assign to $var
if ($var = true and false) // Assign true to $var and compare $var to false

2

मुझे "और" - "&&" - "और" के बीच का अंतर समझाएं।

"और&" और "और" दोनों तार्किक और संचालन हैं और वे एक ही काम करते हैं, लेकिन ऑपरेटर पूर्वता अलग है।

एक ऑपरेटर की पूर्वता (प्राथमिकता) निर्दिष्ट करती है कि "कसकर" यह दो अभिव्यक्तियों को एक साथ कैसे बांधता है। उदाहरण के लिए, अभिव्यक्ति 1 + 5 * 3 में, उत्तर 16 है और 18 नहीं क्योंकि गुणन ("*") ऑपरेटर के अतिरिक्त ("+") ऑपरेटर की तुलना में अधिक पूर्वता है।

उन्हें एकल ऑपरेशन में एक साथ मिलाकर, आप कुछ मामलों में अप्रत्याशित परिणाम दे सकते हैं जिन्हें मैं हमेशा && का उपयोग करने की सलाह देता हूं, लेकिन यह आपकी पसंद है।


दूसरी ओर "&" एक बिटवाइज़ और ऑपरेशन है । इसका उपयोग पूर्णांक मान के भीतर विशिष्ट बिट्स के मूल्यांकन और हेरफेर के लिए किया जाता है।

उदाहरण यदि आप करते हैं (14 और 7) तो परिणाम 6 होगा।

7   = 0111
14  = 1110
------------
    = 0110 == 6

1

आपके द्वारा कौन सा संस्करण उपयोग किया जा रहा है?

यदि विशेष कोडबेस के लिए कोडिंग मानक मैं निर्दिष्ट करता हूं कि किस ऑपरेटर का उपयोग किया जाना चाहिए, तो मैं निश्चित रूप से इसका उपयोग करूंगा । यदि नहीं, और कोड तय करता है जिसका उपयोग किया जाना चाहिए (अक्सर नहीं, आसानी से चारों ओर काम किया जा सकता है) तो मैं इसका उपयोग करूंगा। अन्यथा, शायद &&

क्या 'और' 'और' से अधिक पठनीय है?

क्या यह आपके लिए अधिक पठनीय है । उत्तर हां और नहीं के आधार पर कई कारकों पर निर्भर करता है, जिसमें ऑपरेटर के आसपास कोड शामिल है और वास्तव में इसे पढ़ने वाला व्यक्ति!

|| ~ अंतर है?

हाँ। देखें तार्किक ऑपरेटरों के लिए ||और बिटवाइज़ ऑपरेटर्स के लिए ~


0

मुझे लगता है कि यह स्वाद की बात है, हालांकि (गलती से) उन्हें मिश्रित करने से कुछ अवांछित व्यवहार हो सकते हैं:

true && false || false; // returns false

true and false || false; // returns true

इसलिए, && और || उनके लिए सुरक्षित है कि उनके पास सर्वोच्च प्राथमिकता है। पठनीयता के संबंध में, मेरा कहना है कि ये ऑपरेटर पर्याप्त सार्वभौमिक हैं।

अद्यतन : टिप्पणियों के बारे में यह कहते हुए कि दोनों ऑपरेशन झूठे हैं ... ठीक है, वास्तव में ऊपर दिए गए कोड में कुछ भी वापस नहीं आता है, मुझे अस्पष्टता के लिए खेद है। स्पष्ट करने के लिए: दूसरे मामले में व्यवहार इस बात पर निर्भर करता है कि ऑपरेशन के परिणाम का उपयोग कैसे किया जाता है। ध्यान रखें कि संचालकों की पूर्ववर्ती भूमिका यहाँ कैसे निभाई जाती है:

var_dump(true and false || false); // bool(false)

$a = true and false || false; var_dump($a); // bool(true)

इसका कारण यह $a === trueहै क्योंकि असाइनमेंट ऑपरेटर की किसी भी तार्किक ऑपरेटर पर पूर्वता है, क्योंकि पहले से ही अन्य उत्तरों में बहुत अच्छी तरह से समझाया गया है।


16
यह सच नहीं है, वे सभी झूठे हैं।
जय

0

यहाँ एक छोटा सा काउंटर उदाहरण है:

$a = true;
$b = true;
$c = $a & $b;
var_dump(true === $c);

उत्पादन:

bool(false)

मैं कहूंगा कि इस प्रकार के टाइपो में कहीं अधिक समस्याएँ पैदा होने की संभावना है (उसी तरह से =बनाम के रूप में ==) और जहाँ तक सिंटैक्स त्रुटियों के रूप में चिह्नित किया जाएगा adn/ roटाइपो की तुलना में बहुत कम होने की संभावना है । मुझे भी लगता है और / या पढ़ना बहुत आसान है। FWIW, अधिकांश PHP फ्रेमवर्क जो एक वरीयता को व्यक्त करते हैं (सबसे अधिक नहीं) निर्दिष्ट और / या। मैं कभी भी एक वास्तविक, गैर-विवादित मामले में नहीं चला हूं जहां यह मामला होता।


0

असाइनमेंट ऑपरेशन के ifबिना बयानों का उपयोग करते हुए एक और अच्छा उदाहरण =

if (true || true && false); // is the same as:
if (true || (true && false)); // TRUE

तथा

if (true || true AND false); // is the same as:
if ((true || true) && false); // FALSE

क्योंकि ANDएक कम मिसाल है और इस तरह ||एक उच्च मिसाल है।

इन के मामलों में अलग हैं true, false, falseऔर true, true, false। एन विस्तृत उदाहरण के लिए https://ideone.com/lsqovs देखें ।

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