void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
然而, 有幾個方法不使用暫存空間便能達到此目的.
方法一 使用三次互斥或 (Exclusive OR, XOR)
void swap(int *a, int *b)
{
if(*a != *b) {
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
}
演算式如下所示:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHDcXHSbjt8NkmYuXhEwjQjcMq16SKKX0Gnh2uw6ex-B28NotHvF1dxPisnvKSFies_2nUML0KpC9SkLTRvihCw7WGGVZt0P9_B6AcqlYeBz1RjunWT04DBQPDiqVtoC1Zis4tUcljwbc/s800/xor_swap.jpeg)
簡化上段程式碼: 試想底下程式碼有沒有什麼問題?
#include <stdio.h>
void swap(int *a, int *b)
{
if(*a != *b)
*a ^= *b ^= *a ^= *b;
}
int main(void)
{
int a = 11, b = 3;
printf("===== before swapping =====\n");
printf("a: %d, b: %d\n", a, b);
swap(&a, &b);
printf("===== after swapping =====\n");
printf("a: %d, b: %d\n", a, b);
return 0;
}
直接看執行結果:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF4cOhYrh2VztU6acwDWKwS6eHIzdxM_ya4U0jXErfKsxzmxd7lHaOZIZqgZSS64imDuHj1cy_otpuOkQX_k7QjyOyk0G_T0Y0kPTRE-cnEuURSl9ci7uMqfo7MpisQvUY-vY5LWoqv0c/s640/swap_one_statement_result.jpeg)
為什麼會這樣呢? 筆者將此C程式碼用gcc編譯成組合語言, 用以了解其運作邏輯, 底下為swap函式片段程式碼, 完整組合語言程式碼請按此連結下載.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5ER0hk7lyiZecTaoSOfNINVIgF0y1DxAxcI1nMrd0oJO2-4T4i65ZKvoh9ZzxQQSL1x9ofznGud8dT-TEOWiCYFd3AUUJdR1Cmi_-r5Kx7k3XEhfnI7WIyRqjq4JdkeGoIKpoOvhoMQ4/s640/swap_one_statement_assembly.jpeg)
程式堆疊示意圖
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMKpYQCaOy0G1FmPC0uOYApZVZPJDVCeSMejc1eQZ2OJgrhEzRmcRoIdtOfx0qIzsucsXB78ZMS3QEOFWS9qE1aAHjfk5tam2H9RNK8v5qDpvZYvqarmlZmUsbXyAZ63V4Vlij-WRir_8o/s640/swap_one_statement_stack.jpeg)
程式說明:
由於使用一行程式碼做三次XOR, gcc編譯器會先把*a, *b, *a, *b的內容放在edx(11), ecx(3), ebx(11), eax(3)暫存器 (line 9-16), 然後再分別對這四個暫存器做三次的XOR: