2008-11-08 62 views
6

在C++中有什麼方法可以進行並行賦值嗎?目前,編譯以下(含警告)在C++中的並行賦值

#include <iostream> 

int main() { 
    int a = 4; 
    int b = 5; 
    a, b = b, a; 
    std::cout << "a: " << a << endl 
      << "b: " << b << endl; 

    return 0; 
} 

和打印:

a: 4 
b: 5 

我想它打印......如果這人是不是很明顯,就是:

a: 5 
b: 4 

正如紅寶石或蟒蛇一樣。

回答

16

這是不可能的。你的代碼示例

a, b = b, a; 

解釋通過以下方式:

a, (b = b), a 

它什麼都不做。逗號運算符使它返回一個(最右邊的操作數)的值。因爲賦值綁定更緊密,所以b = b在parens中。

正確的方法做,這只是

std::swap(a, b); 

升壓包括一個元組類,你可以做

tie(a, b) = make_tuple(b, a); 

它在內部創建引用的元組A和B,然後分配給他們一個b和a的元組。

1

或Perl。但是,沒有,這是不可能的(據我所知),你需要使用一個臨時變量,如:

int a = 4; 
int b = 5; 

{ 
    int tmp = a; 
    a = b; 
    b = tmp; 
} 

僅供參考,內部的語言(或Perl ATLEAST)建立一個臨時列表{ a, b },然後將該列表分配給兩個變量。換句話說,如果只有更多的混亂,這至少是性能表現。

3

並行分配在C++中不受支持。支持這種語言的語言通常將a,b,c作爲賦值運算符任一側的列表,這不是逗號運算符在C++中的工作方式。在C++中,a, b評估a然後b,因此a, b = b, aa; b = b; a;相同。

0

或Lua ...
C/C++有一些技巧,例如使用xor或操作,但有溢出風險等。只要做到這一點痛苦的方式,三個任務。沒什麼大不了的。

+0

可能要提及異或技巧也只適用於整型。另外,整數升級可以防止溢出,但是兩個相同類型不會溢出,異或操作0b1110 xor 0b1010將始終爲0b1100,這是一個按位操作 – Beached 2017-10-12 02:56:24

0

標準庫中沒有這樣的功能。你可以寫一組模板函數:

template <typename T1> void ParAssign(T1& Lhs_1, T1 const& Rhs1); 
template <typename T1, typename T2> void ParAssign(T1& Lhs1, T2& Lhs2, T1 const& Rhs1, T2 const& Rhs2); 
// etc. 
ParAssign(a,b, 
      b,a); 

這是不平凡的,如果有別名,如您的交換的例子。

+0

std :: swap(a,b) – Beached 2017-10-12 02:50:53

0

這個問題很舊–我今天偶然發現了......
......並且想知道爲什麼之前沒有人給出這個答案......

我認爲,這是可能做到這一點在C++ 11類似像Python做它(引擎蓋下):

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a = 4, b = 5; 
    cout << "Before assignment: a: " << a << ", b: " << b << endl; 
    pair<int&, int&> ba(b, a); 
    ba = make_pair(a, b); // <===: (b, a) = (a, b) 
    cout << "After assignment : a: " << a << ", b: " << b << endl; 
    return 0; 
} 

我想這一點上ideone.com。輸出是:

Before assignment: a: 4, b: 5 
After assignment : a: 5, b: 4 

如果我沒記錯的話(我不是一個Python的專家),在Python,a, b表示對。 (Python Doc.: 5.3. Tuples and Sequences

這樣的對可以很容易地在C++ 11中完成,例如,與std::pair。在這種情況下,我做了一對引用並分配了一對值。它在make_pair()加載這兩個變量之前,將正確的一對(值)分配給左側引用對。

再次滾動,我意識到這個答案接近基於提升的解決方案Johannes answer

可能是,原因是它沒有在C++ 03中工作。我在coliru.stacked-crooked.com上嘗試過:使用-std=c++03它會產生糟糕的結果,讀取編譯器錯誤–更改爲-std=c++11,它會按上述方式編譯和執行。

免責聲明

我無法想象這個解決方案有利於也不可以有什麼實用價值。這不是我想要做的。還有很多其他答案指出「這行不通」。恕我直言,它確實(根據C++語言正確拼寫)...