[英]Why this is happening in the following code?
我正在運行這個 c++ 程序,用於在 ubuntu 中使用 g++ 編譯器交換兩個數字。
int a = 6, b = 9;
a = a ^ b ^ (b = a);
cout << a << " " << b;
我得到這個輸出9 6
。 在處理b=a
部分之前,這里首先處理b
( b
舊值是 9)。
但是當我運行這個程序時
a = a ^ b + (b = a);
cout << a << " " << b;
我得到10 6
作為輸出。 這意味着這里b = a
首先處理一部分,因此每個b
的值現在都是6
因此它給出輸出10 6
。
誰能解釋為什么會這樣?
a = a ^ b ^ (b = a)
涉及未定義的行為,因為未指定求值順序。 如果您只想交換兩個整數,請使用std::swap
:
using std::swap;
int a = 6, b = 9;
swap(a, b);
您的代碼行為未定義! (b=a)
寫入b
。 在同一表達式a^b^(b=a)
中也有b
讀數,並且該表達式中也沒有測序點。
該語言沒有定義在未排序的步驟中讀取和寫入同一變量的行為。
請注意,為避免疑義,括號中沒有指定求值順序,而是指定分組。
PS XOR 交換很愚蠢,而且可能比std::swap
慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.