[英]a = (a + b) - (b = a); C++ vs php
我一直在環顧四周,發現公式: a = (a + b) - (b = a)
它應該交換兩個變量(或在某些情況下為對象)。 但是我用C ++和php進行了測試,這些給了我不同的結果。
的PHP:
$a = 10;
$b = 20;
$a = ($a + $b) - ($b = $a);
echo $a, " ", $b;
打印20 10
C ++
int a = 10;
int b = 20;
a = (a + b) - (b = a);
std::cout << a << " " << b;
打印10 10
代碼看起來相同,但輸出不同,我一直在思考兩個原因:
有人可以解釋一下,為什么在這種情況下C ++和php輸出不同嗎?
我不確定PHP中的規則是什么,但是在C ++中,未嚴格定義單個子表達式的順序,或者按照技術術語,它是“未指定”的-換句話說,允許編譯器計算b = a
之前或之后的b = a
a + b
。 只要在減法之前a + b
和b = a
。 使用“未指定”的行為可以使編譯器在某些情況下產生更有效的代碼,或者僅僅是為某些體系結構構建編譯器是可能的。
這也意味着,如果您有一個表達式可以“重新計算”表達式本身內的值,並且在表達式中的其他位置使用它,則會得到未定義的行為(簡稱UB)。 UB的意思是,行為沒有定義-幾乎任何事情都可能發生,包括您看到的內容和許多其他選擇(例如,即使邏輯上說答案不是,編譯器也可以生成42結果) 42在這種情況下[這是一個錯誤的問題!])。
我還建議,如果要交換兩個值,請使用PHP:
$t = $a;
$a = $b;
$b = $t;
在C ++中:
#include <algorithm>
std::swap(a, b);
或者如果您堅持要自己編寫:
int t = a;
a = b;
b = t;
嘗試變得聰明並“沒有臨時變量”執行它幾乎肯定會使其比使用臨時變量(肯定是在C ++這樣的編譯語言中)和在PHP這樣的解釋語言中使用慢,創建一個新變量可能會增加一點額外的開銷,但與所需邏輯上的額外努力相比,它可能不會那么大。
由於未定義的行為,C ++代碼被完全破壞。 (在一個序列點中讀取和寫入b
)。
對於PHP:
$a = 10;
$b = 20;
$a = ($a + $b) - ($b = $a);
//executes like thus
$a = (30) - ($b = $a);
$a = (30) - ($b = $a = 10); //new $a still not computed, using older $a
$a = (30) - (10);
$a = 20;
//then, $a=20 and $b = 10
這與操作符優先級完全相關,在C中可能相同,也可能不同,這取決於優先級(如果未發生意外行為)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.