簡體   English   中英

為什么在下面的代碼中會發生這種情況?

[英]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部分之前,這里首先處理bb舊值是 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.

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