2011-08-03 8 views
8

पीएचपी:ऑपरेटर पूर्वता मुद्दा

$a = 2; 
$b = 3; 
if($b=1 && $a=5) 
{ 
    $a++; 
    $b++; 
} 
echo $a.'-'.$b; 


$a = 2; 
$b = 3; 
if($a=5 and $b=1) 
{ 
    $a++; 
    $b++; 
} 
echo $a.'-'.$b; 

आउटपुट 6-16-2 मैं 1 यहाँ समझ में नहीं आता।

पर्ल:

$a = 2; 
$b = 3; 
if($b=1 && $a=5) 
{ 
    $a++;                    
    $b++; 
} 
print $a.'-'.$b; 


$a = 2; 
$b = 3; 
if($a=5 and $b=1) 
{ 
    $a++; 
    $b++; 
} 
print $a.'-'.$b; 

आउटपुट 6-66-2, मैं दूसरे 6 यहाँ समझ में नहीं आता।

कोई भी कारण जानता है?

दरअसल मुझे पता है कि &&and से अधिक प्राथमिकता है, लेकिन मुझे हाथ से पहले यह जानने पर संदेह है।

अद्यतन

अब मैं PHP एक, क्या पर्ल एक के बारे में समझते हैं?

उत्तर

10

पर्ल के बारे में:

PHP के विपरीत (लेकिन पाइथन, जावास्क्रिप्ट, आदि की तरह) बूलियन ऑपरेटर एक बूलियन मान वापस नहीं करते हैं लेकिन मान को सही (या अंतिम मान) अभिव्यक्ति के अंतिम परिणाम को निर्धारित करता है (source)।

$b=1 && $a=5 

रूप

$b = (1 && $a=5) // same as in PHP 

जो $b = (1 && 5) (काम "रिटर्न" सौंपा मूल्य) के समान ही है और $b करने के लिए 5 प्रदान करती मूल्यांकन किया जाता है।


लब्बोलुआब यह है: ऑपरेटर पूर्वता (कम से कम इस मामले में) पर्ल और PHP में ही है, लेकिन वे क्या मूल्य बूलियन ऑपरेटरों द्वारा दिया जाता है में मतभेद है।

FWIW, PHP की ऑपरेटर प्राथमिकता here मिल सकती है।


अधिक रूचिकर (कम से कम यह मेरे लिए नया था) कि PHP वेतन वृद्धि/कमी ऑपरेटरों के लिए जैसे रूपांतरण प्रदर्शन नहीं करता है।

तो $btrue है, तो $b++ मूल्य को true के रूप में छोड़ देता है, जबकि उदा।$b += 12 से $b असाइन करता है।


†: क्या मैं इस के साथ मतलब है कि यह रिटर्न पहले (वाम-पंथी) मूल्य जो

  • &&
  • के मामले में false का मूल्यांकन ||
  • के मामले में true का आकलन करती है

या अभिव्यक्ति का अंतिम मूल्य। पर्ल में 1 & & 5 रिटर्न 5:

+0

पायथन में यह पहली झूठी-झूठी या आखिरी ओवरव्यू में परिवर्तित हो जाता है। मुझे लगता है कि पर्ल एक ही तरह से – RiaD

+0

@ जेरोग - एक '&&' अभिव्यक्ति का मूल्यांकन बंद होने पर मूल्यांकन बंद हो जाएगा, इसलिए '1 && 0 और 5',' 0' में अंतिम मान है। इसी प्रकार, '1 && undef && 5'' undef' का मूल्यांकन करेगा। – mob

+1

@ जे रोज '&&' अगर इसका बायां तर्क गलत है तो इसका बायां तर्क लौटाता है; otehrwise यह अपने सही तर्क देता है। '|| अपने बाएं तर्क को लौटाता है यदि इसका बायां तर्क सत्य है, अन्यथा यह सही तर्क देता है। इसलिए '&&' की एक श्रृंखला बाएं सबसे झूठी मान (या अंतिम मूल्य यदि सभी सत्य थे) लौटाती है और '||' की एक श्रृंखला बाएं सबसे सच्चे मूल्य (या अंतिम मूल्य अगर सभी गलत होती है) देता है। – hobbs

6

पहले उदाहरण

$a = 2; 
$b = 3; 
if($b=1 && $a=5) // means $b = (1 && $a=5) 
{ 
    var_dump($b); //bool(true) because of && 
    $a++; 
    $b++; //bool(true)++ ==true, ok 
} 
echo $a.'-'.$b; 

आशा है कि आप उनमें से आखिरी यदि उत्पादन में उन कोड)

मैं पर्ल में noob हूँ, लेकिन मैं एक & & ख कर सकते हैं सुझाव एक या बी (रिटर्न का उपयोग नहीं होगा उन सभी को bool करने के लिए परिवर्तित), बूलियन नहीं, तो $ ख = (1 & & $ एक = 5) रिटर्न $ ख = 5 (है 5)

+0

+ 1, अब मैं '1' समझता हूं। –

+0

यह बहुत अंतर्दृष्टिपूर्ण है, लेकिन ओपी के सवाल का जवाब देने से कम हो जाता है। एफपीपी बूलियन होने के लिए '$ बी' क्यों मानता है? और ओपी के उदाहरण में क्या बिल्ली है? – Asaph

+0

आपको आश्चर्य होता है कि एक सशर्त संकेतित PHP में असाइनमेंट डालने पर आप एक संख्या के बजाय बूलियन चाहते हैं, इसलिए यह गलत प्रकार पर आ गया है ... –

2

के रूप में सशर्त कोड प्राप्त करते हैं। 2: and पर perl में बहुत कम प्राथमिकता है, यह && का समानार्थी नहीं है। इसलिए नमूना (($a = 5) and ($b = 1)) के रूप में निष्पादित किया जाता है जो क्रमशः $ ए और $ बी से 5 और 1 सेट करता है और अंतिम तर्क (यानी 1) का मान देता है।

++ के बाद आपको 6-2 मिलते हैं।