2011-08-03 23 views
8

PHP:運算符優先級問題,在Perl和PHP

$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這裏。

的Perl:

$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有更高的優先級,但我還是有把握的時候才知道這一點。

UPDATE

現在我明白了一個PHP,什麼Perl的一個?

回答

10

關於的Perl:

與PHP(但像Python,JavaScript等)不同,布爾運算符不返回布爾值,但使表達式成爲真值(或最後一個值)的值決定了表達式的最終結果source)。

$b=1 && $a=5 

被評價爲

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

其是相同$b = (1 && 5)(賦值 「返回」 分配的值),並分配給5$b


的底線是:運算符優先級是在Perl和PHP一樣(至少在這種情況下),但他們是由布爾運算符返回什麼值不同。

FWIW,PHP的運算符優先級可以找到here


更有趣的(​​至少這是新的我)是PHP不會爲遞增/遞減運算進行類型轉換。

所以如果$btrue,然後$b++離開值作爲true,而例如$b += 1分配2$b


†:我的意思與此的是,它返回第一個(最左邊)值

  • 計算爲false&&
  • 情況的||
  • 情況評估爲 true

或表達式的最後一個值。

+0

在Python中,它首先將錯誤轉換爲false或最後一個返回。我認爲Perl的做法是一樣的 – RiaD

+0

@JeRog - 一個'&&'表達式將停止評估何時遇到一個錯誤的值,因此在'1 && 0 && 5'中,'0'是最後一個值。同樣,'1 && undef && 5'將評估爲'undef'。 – mob

+1

@Je Rog如果左邊的參數爲false,則返回左邊的參數;無論如何,它都會返回正確的論點。如果左參數爲true,則返回它的左參數,否則返回它的正確參數。所以'&&'鏈返回最左邊的假值(或者如果全部爲真,則返回最後一個值),而一串'||'返回最左邊的真值(或者最後一個值,如果全部爲假)。 – 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; 

希望你不會在生產中使用這些代碼)

我在perl的菜鳥,但我可以提出一個& & B返回或b(他們最後如果它們全部轉換爲bool),不布爾值,則$ b =(1 & & $ A = 5)返回$ b = 5(在5)

+0

+ 1,我現在明白了'1'。 –

+0

這非常有洞察力,但沒有回答OP的問題。爲什麼php認爲'$ b'是布爾值?在OP的例子中,perl正在做什麼? – Asaph

+0

讓你想知道如果把這個任務放在一個有條件的暗示的PHP中,你想要一個布爾值而不是一個數字,所以它會轉換成錯誤的類型... –

4

這裏的問題:1 & & 5返回5 Perl編寫的。如果您將條件編碼爲if(($b=1) && ($a=5))

2

對於Perl, 2:and在perl中的優先級非常低,它不是&&的同義詞。因此樣本執行爲(($a = 5) and ($b = 1)),它分別將$ a和$ b設置爲5和1並返回最後一個參數(即1)的值。

++之後你得到6-2。