[問題] #define 輸出問題

看板C_and_CPP (C/C++)作者時間3年前 (2021/10/08 21:23), 編輯推噓12(15324)
留言42則, 23人參與, 最新討論串1/1
#include <stdio.h> #define SWAP(a, b) tmp = a; a = b ; b = tmp int main(){ int a = 10; int b = 20; int tmp = 0; int n = 6; if(n>6) SWAP(a,b); printf("%d %d %d\n", tmp, a, b); } 自己覺得if應該不會執行(因為沒有縮排) 然後只執行SWAP那行 所以是 10 20 10 但是在vscode上編譯出來的結果是 0 20 0 我不太懂為什麼會這樣 麻煩大神開示 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.251.3.84 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1633699392.A.299.html

10/08 21:27, 3年前 , 1F
變成 if(n>6){tmp=a;} a=b; b=tmp;
10/08 21:27, 1F

10/08 21:33, 3年前 , 2F
還有C++不管縮排,是看 ; 決定一個 statment 的
10/08 21:33, 2F

10/08 21:54, 3年前 , 3F
do while 0
10/08 21:54, 3F

10/08 22:18, 3年前 , 4F
答案同一樓。
10/08 22:18, 4F

10/09 00:18, 3年前 , 5F
有時後需要前處理的程式並不好讀,這時可以用 gcc -E,
10/09 00:18, 5F

10/09 00:18, 3年前 , 6F
得到前處理完後的程式碼,再利用 clang-format 排版
10/09 00:18, 6F

10/09 00:19, 3年前 , 7F
這樣問題就會變得顯而易見了
10/09 00:19, 7F

10/09 03:12, 3年前 , 8F
善用 do while(0) 可以減少這種意外
10/09 03:12, 8F

10/09 07:54, 3年前 , 9F
好奇為什麼答案不是0 10 20,而是0 20 0
10/09 07:54, 9F

10/09 09:55, 3年前 , 10F
實際上會被執行到的是 a=b; 和 b=tmp; 所以是 0 20 0 沒
10/09 09:55, 10F

10/09 09:55, 3年前 , 11F
10/09 09:55, 11F

10/09 10:34, 3年前 , 12F
感謝樓上,對照一樓我才終於懂了。一直當成類似func
10/09 10:34, 12F

10/09 10:34, 3年前 , 13F
tion的東西
10/09 10:34, 13F

10/09 14:02, 3年前 , 14F
有點眼熟...在看發哥考古喔?
10/09 14:02, 14F

10/09 14:41, 3年前 , 15F
答:男生寫macro的都剁掉
10/09 14:41, 15F

10/09 16:48, 3年前 , 16F
不要這樣 我很愛用X-macro
10/09 16:48, 16F

10/10 17:36, 3年前 , 17F
因為這是寫爛的程式碼 看不懂很正常
10/10 17:36, 17F

10/10 17:38, 3年前 , 18F
{tmp=a;a=b;b=tmp}另外還有掛號等號左邊問題 煩
10/10 17:38, 18F

10/10 17:38, 3年前 , 19F
括弧
10/10 17:38, 19F

10/10 17:39, 3年前 , 20F
上面有do while 大法還不錯但我還是建議寫function
10/10 17:39, 20F

10/10 21:46, 3年前 , 21F
拿Macro做這種事還滿意義不明的 你又不一定有tmp存在
10/10 21:46, 21F

10/12 08:52, 3年前 , 22F
大概是這樣吧(?) http://i.imgur.com/HcylhqP.jpg
10/12 08:52, 22F

10/12 13:09, 3年前 , 23F
看成 SWAG
10/12 13:09, 23F

10/12 21:25, 3年前 , 24F
我倒覺得macro在一些情況下滿好用的
10/12 21:25, 24F

10/12 21:25, 3年前 , 25F
以SWAP來說,可以做成適用多種型別
10/12 21:25, 25F

10/12 21:25, 3年前 , 26F
把一個參數作為型別,也就是SWAP(type,a,b)這樣
10/12 21:25, 26F

10/12 21:26, 3年前 , 27F
jdoodle.com/ia/hYS
10/12 21:26, 27F

10/12 21:27, 3年前 , 28F

10/13 15:59, 3年前 , 29F
括號很重要,我都跟學弟說,不管有幾行,你就是給我加
10/13 15:59, 29F

10/13 15:59, 3年前 , 30F
括號,別偷懶。回到這問題,把if加上括號,你會發現不
10/13 15:59, 30F

10/13 15:59, 3年前 , 31F
同的小天地
10/13 15:59, 31F

10/14 05:25, 3年前 , 32F
C 縮排 CC
10/14 05:25, 32F

10/16 21:17, 3年前 , 33F
哈哈
10/16 21:17, 33F

10/25 00:53, , 34F
不建議這種東西用macro
10/25 00:53, 34F

10/26 11:29, , 35F
看哪本書學的?
10/26 11:29, 35F

10/26 17:45, , 36F
除了if習慣加大括號以外,macro的誤用問題會更大,沒真的
10/26 17:45, 36F

10/26 17:48, , 37F
搞懂macro在幹嘛的話,會連#define square(x) (x)*(x)
10/26 17:48, 37F

10/26 17:48, , 38F
這經典題為何會出錯都不知道XD
10/26 17:48, 38F

10/26 17:49, , 39F
連括號為什麼要括,要括幾層都不知道,還不如乖乖function
10/26 17:49, 39F

10/26 21:57, , 40F
10/26 21:57, 40F

12/31 17:25, , 41F
不括弧都只會執行一行
12/31 17:25, 41F

12/31 17:26, , 42F
判斷一行
12/31 17:26, 42F
文章代碼(AID): #1XO4P0AP (C_and_CPP)
文章代碼(AID): #1XO4P0AP (C_and_CPP)