[問題] swap兩個元素的方法

看板C_and_CPP作者 (小那)時間15年前 (2010/04/27 07:31), 編輯推噓11(11019)
留言30則, 5人參與, 最新討論串1/4 (看更多)
遇到的問題: (題意請描述清楚) swap 兩個數值 可以這樣寫 void swap(int *a, int *b) //交換a跟b指向位置的值 { int temp; temp = *a; *a = *b; *b = temp; } 還有什麼別的方法嗎 ? 為什麼不能傳值到function 裡面去作交換 void swap(int a, int b) //交換a跟b指向位置的值 { int temp; temp = a; a = b; b = temp; } 我試的結果是 swap裡面 是交換了 但是回去 main 之後,卻仍沒交換~~ 這是為什麼? 為什麼 一定要用傳位址~~ 希望得到的正確結果: 程式跑出來的錯誤結果: 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) 有問題的code: (請善用置底文標色功能) 補充說明: -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.39.115

04/27 15:35, , 1F
應該該還有 用傳址方式的寫法吧 ??
04/27 15:35, 1F

04/27 15:36, , 2F

04/27 15:36, , 3F
你的問題應該是scope的問題吧
04/27 15:36, 3F

04/27 15:39, , 4F
因為是call by value 所以 原本的變數內容並不會改變
04/27 15:39, 4F

04/27 15:41, , 5F
如果不傳址 只是將兩個傳入的值 放入local 變數交換值
04/27 15:41, 5F

04/27 15:52, , 6F
偷推自己的文 #1A5iL3A- (C_and_CPP) ....XD
04/27 15:52, 6F

04/27 16:27, , 7F
6F的文章真是詳細爬文才發現XD
04/27 16:27, 7F

04/27 17:43, , 8F
#define SWAP(x,y) {x^=(y^=(x^=y));}
04/27 17:43, 8F

04/27 17:44, , 9F
也來偷推一下自己的文 XD http://disp.cc/b/11-Lw
04/27 17:44, 9F

04/27 17:48, , 10F
applecool 那個如果傳了x與y是同一變數就....XD
04/27 17:48, 10F

04/27 17:55, , 11F
k大的網頁好炫....XD
04/27 17:55, 11F

04/27 18:00, , 12F
??
04/27 18:00, 12F

04/27 18:03, , 13F
同一變數為何要swap?
04/27 18:03, 13F

04/27 18:09, , 14F
曾經寫迴圈這麼玩的時候不小心這麼SWAP了array的同一個
04/27 18:09, 14F

04/27 18:10, , 15F
element, 然後debug半天才找到為什麼被swap成0....Orz
04/27 18:10, 15F

04/27 18:11, , 16F
只是hint一下可能有意料之外的side effect....XD
04/27 18:11, 16F

04/27 18:12, , 17F
又, 如果swap的對象是pointer, 而同樣的資料的pointer
04/27 18:12, 17F

04/27 18:12, , 18F
會指到同一位址的時候, 也會被這個side effect影響到:)
04/27 18:12, 18F

04/27 18:13, , 19F
有道理
04/27 18:13, 19F

04/27 18:16, , 20F
受教了 那不如使用
04/27 18:16, 20F

04/27 18:16, , 21F
#define SWAP(x,y) {int t=y; y=x; x=t;}
04/27 18:16, 21F

04/27 18:18, , 22F
謝謝 V 大 :-)
04/27 18:18, 22F

04/27 18:19, , 23F
我也好想請教K大的網頁是怎麼做的 ^^ 謝謝
04/27 18:19, 23F

04/27 18:30, , 24F
如果x,y不是int會....XD
04/27 18:30, 24F

04/27 18:34, , 25F
那直接複製記憶體吧~~
04/27 18:34, 25F

04/27 18:37, , 26F
memcpy 或 memmove
04/27 18:37, 26F

04/28 02:46, , 27F
喔喔 那是我做的仿BBS網站啊 每頁加個換頁符號^L就行了
04/28 02:46, 27F

05/07 11:48, , 28F
C++ std::swap
05/07 11:48, 28F

01/05 23:58, , 29F
更正: #define SWAP(x,y) {x^=(y^=(x^=y));} 是不正確的
01/05 23:58, 29F

01/06 00:02, , 30F
跟上面一樣是更正啟示: 記憶體複製的手法也不完全正確
01/06 00:02, 30F
文章代碼(AID): #1BrfBNbK (C_and_CPP)
文章代碼(AID): #1BrfBNbK (C_and_CPP)