簡體   English   中英

a =(a + b)-(b = a); C ++與PHP

[英]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

代碼看起來相同,但輸出不同,我一直在思考兩個原因:

  1. C ++代碼正在編譯,php正在解釋。
  2. 此公式無用,因為它導致未定義的行為。

有人可以解釋一下,為什么在這種情況下C ++和php輸出不同嗎?

我不確定PHP中的規則是什么,但是在C ++中,未嚴格定義單個子表達式的順序,或者按照技術術語,它是“未指定”的-換句話說,允許編譯器計算b = a之前或之后的b = a a + b 只要在減法之前a + bb = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM