2012-08-16 98 views
6

的PHP級聯我開始學習PHP不是很久以前,我就遇到了這個問題:字符串和算術運算

<?php 

$a = 1; 
$b = 2; 

echo "$a * $b = " . $a * $b; 
echo "<br />"; 

echo "$a/$b = " . $a/$b; 
echo "<br />"; 

echo "$a + $b = " . $a + $b; 
echo "<br />"; 

echo "$a - $b = " . $a - $b; 
echo "<br />"; 

我得到以下輸出:

1 * 2 = 2 
1/2 = 0.5 
3 
-1 

的最後兩行輸出不是我所期望的。

這是爲什麼?這些表達式是如何評估的?我試圖更好地理解這門語言。

+0

作爲一般指導原則,您可能不應該依賴於PHP的弱類型。 – 2012-08-16 18:32:43

回答

8

發生這種情況是因爲級聯運算符比加法或減法運算符有higher precedence,但乘法和除法具有更高的優先級,然後級聯。

所以,你實際上執行的是這樣的:

echo ("$a + $b = " . $a) + $b; 
echo ("$a - $b = " . $a) - $b; 

在第一種情況下,被變成了這樣:

"1 + 2 = 1" + $b 

的PHP試圖"1 + 2 = 1"轉換爲數字(因爲type juggling)並得到1,將該表達式變成:

1 + 2 

Whic h是爲什麼你得到3.相同的邏輯可以應用於減法條件。相反,如果您在計算周圍放置括號,您將獲得所需的輸出。

echo "$a + $b = " . ($a + $b); 
echo "$a - $b = " . ($a - $b); 
+2

另一種解決方案是不連接,但在呼叫中使用多個參數來回顯。 'echo'$ a + $ b =「,$ a + $ b;' – 2012-08-16 18:46:53

+0

@RobertK或['printf()'](http:// php。net/printf) – Wiseguy 2012-08-16 18:59:09

+0

在我看來,給予一半運算符更高的優先級而不是串聯是非常不合邏輯的,其中一半優先級更低......有人知道爲什麼會出現這種情況嗎?這只是不好的設計,或者是有原因嗎? – user3640967 2016-02-16 12:07:40

1

並置優先於加法和減法,但不是乘法或除法。所以

echo "$a + $b = " . $a + $b; 

相當於

echo ("$a + $b = " . $a) + $b; 

和PHP忽略第一部分,因爲很難將其轉換成一個數字,讓你只用+ $b

如果你使用括號,你應該沒問題。

0

嗯,你已經找到真正怪異的行爲,但:)

從從算術運算符,除法和乘法具有最高的優先級,所以他們的連接前評估。

雖然添加和提取的優先級較低,但首先評估左側部分,然後將其添加/提取到右側部分。但是PHP試圖從字符串中提取數字值,只有第一個字符是這樣的,所以它就是這樣做的。