知識社群登入
位置: AutoCAD開放式教學 > 討論區 > 討論
兩個變數的值作 交換的動作
1樓
不准 使用第三個變數,

而且,只能夠使用 一個指令



#if 0

a=   210, b=   197
請按任意鍵繼續 . . .
a=   197, b=   210
請按任意鍵繼續 . . .

#endif
// ------------------------------------------

#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// ------------------------------------------

int main()
{
int a, b;
srand(time(NULL));
a= rand()%1000;
b= rand()%1000;
printf("a= %5d, b= %5d \n", a, b);
system("pause");
// ------------------------------------------
// swap a, b
a^= b^= a^= b;
printf("a= %5d, b= %5d \n", a, b);
system("pause");
// ------------------------------------------
return(0);
}// end of main()

2樓
如何只用x,y兩變數來交換彼此數值

int a, b;
a= 123; b= 456;

a^= b^= a^= b;
// 只要 一行指令,不需要使用第三個變數,
即可達到 目的。

請問:為什麼?



※ 引述《ballgi (環給一個幸福)》之銘言:
: 不好意思,我想請教一個問題
: x=1
: y=2
: 如果不用第三個變數就能轉換彼此的數值為
: x=2
: y=1
: 我不知道可以這樣作耶,請問誰能指導我,謝謝
: 在此感謝鄉民提供的智慧

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.80.251.64
 [1;37m推  [33mnowar100 [m [33m:這方法不好 有 side effect                              [m 04/11 14:21
 [1;31m→  [33mnowar100 [m [33m:分三行寫吧,且我覺得可讀性大輸,                       [m 04/11 14:22
 [1;37m推  [33mYshuan [m [33m:推樓上...                                                [m 04/11 14:36
 [1;37m推  [33mledia [m [33m:a^=(b^= (a^=b))  最裡面那層做完, a 變成 a, b 的 bit diff  [m 04/11 14:45
 [1;31m→  [33mledia [m [33m:接下來 b^= (bit diff) -> 變成 a, 最後 bit_diff ^= a -> b  [m 04/11 14:46
 [1;37m推  [33mcismjmgoshr [m [33m:a^a=0, a^b=b^a, (a^b)^c=a^(b^c), a^1=a 大概是這樣   [m 04/11 15:22
 [1;31m→  [33mlittleshan [m [33m:不要這樣寫!這是 implementation-defined behavior     [m 04/11 15:48
 [1;31m→  [33mlittleshan [m [33m:就是十誡之八啦                                       [m 04/11 15:49
 [1;37m推  [33mEbergies [m [33m:而且這個方法速度也比較慢...                            [m 04/11 15:58
 [1;31m→  [33mTsinTa [m [33m:剛剛測了一下,還真的比較慢@@"                            [m 04/11 16:18
 [1;31m→  [33msjgau [m [33m:謝謝 大家的回覆,我大概懂了。等我有空,再來整理一下       [m 04/11 17:15
 [1;31m→  [33myoco315 [m [33m:而且就算速度沒有比較慢,這個實作也存在一個很隱微的bugXD  [m 04/11 18:00
 [1;31m→  [33myoco315 [m [33m:不過我也不知道這個方法比較慢耶.. 請教一下原因?          [m 04/11 18:01
 [1;31m→  [33msjgau [m [33m:是否有 side effect, 我會再詳細測試                        [m 04/11 18:54
 [1;31m→  [33msjgau [m [33m:是否比較慢,我也會再 詳細測試                             [m 04/11 18:54
 [1;31m→  [33mnowar100 [m [33m:side effect 不是你可以"詳細測試"出來的....             [m 04/11 19:10
 [1;37m推  [33mpurpose [m [33m:要做三次xor,加上assignment。tmp=a; a=b; b=tmp; 做三次  [m 04/11 19:34
 [1;31m→  [33mpurpose [m [33m:assignment (mov) 就做完了                               [m 04/11 19:34
 [1;31m→  [33mkevingwn [m [33m:印象中編出來的asm反而比較長                            [m 04/11 22:06
 [1;37m推  [33mwowtiger [m [33m:因為對現行的CPU而言 xor 是要三個指令 mov 是沒有指令    [m 04/11 22:06
 [1;37m推  [33mlaiis [m [33m:如果只是交換... x=x+y; y=x-y; x=x-y;  這樣如何..?         [m 04/11 22:15
 [1;37m推  [33mwowtiger [m [33m:跟 xor  是一樣的 除了一些有所謂 xor 特化的 CPU 之外    [m 04/11 22:20
 [1;31m→  [33msoftwind [m [33m:就講 不要這樣寫了... 你寫ASM才來考慮這問題             [m 04/12 00:05
 [1;31m→  [33mtropical72 [m [33m:我測過,實際上真的慢很多 (for vc6.0 2008 2010)       [m 04/12 01:56