2016-09-30 42 views
-2

我們平時使用的交換兩個數字沒有用C第三/ C++

a=a+b; 
b=a-b; 
a=a-b; 

邏輯來解決這個代碼,但是,如果我們用int工作,然後說以後30000的代碼失敗,如果我們採取long ,在說出1000000左右後失敗。我的目標是,不要增加代碼的長度,請執行相同的操作。我已經試過用BIT wise XOR,

a = a^b; 
b = a^b; 
a = a^b; 

還是沒有幫助,有什麼想法?

+1

歡迎來到SO :-)你能解釋一下「代碼失敗」是什麼意思嗎?究竟出了什麼問題? –

+5

看起來像http://stackoverflow.com/q/1826159/2579220 – mvw

+1

如果'a'和'b'太大,則加法可能超出整數範圍。 –

回答

4

要交換的可變a和可變bstd::swap(a, b);
實施例:

int a = 10; 
int b = 20; 

std::cout << "Before swap\n"; 
std::cout << "Value of a: " << a << '\n'; 
std::cout << "Value of b: " << b << '\n'; 

std::swap(a, b); 

std::cout << "After swap\n"; 
std::cout << "Value of a: " << a << '\n'; 
std::cout << "Value of b: " << b << '\n'; 

使用GCC 4.9.2輸出:

之前交換
值的一個:10
b值:20
交換後
價值一:20
值B的:10

做的這種方式使用右值內部,因此具有接近於零的開銷用於其他用途的情況下,並不會溢出任何原始類型不斷

+1

你是什麼意思,「這種做法使用右值,所以它接近零開銷」。 –

+0

移動一個int與複製它的成本完全相同。不,std :: swap特別不適用於r值(它在內部使用它們,但是對於int也沒有什麼不同)。 – MikeMB

+0

@MikeMB關於僅在內部使用右值的好處,我認爲在上下文中會很清楚。編輯爲bo明確。並且,對於整數來說也是一樣的,但我試着回答儘可能廣泛適用的問題,所以我想指出'std :: swap'的一般好處。 –