Re: [FAQ&FME] C 語言新手十誡

看板C_and_CPP (C/C++)作者 (Victor)時間19年前 (2005/08/28 00:45), 編輯推噓1(104)
留言5則, 1人參與, 最新討論串10/14 (看更多)
※ 引述《yaca (Jay)》之銘言: : 在k大原po的第十一點,macro中,如果我的程式碼: : #include<stdio.h> : #define squared(a)a*a-a*a : int main(void){ : int x=3,i; : i=squared(++x); : printf("i=%d\n",i); : return 0; : } : 為什麼答案為-24,可以教教我嗎? :                      謝謝囉 是第十點吧? macro中 的變數一定要用括號括起來 至於為什麼? 因為 編譯器所做的 並不是把數字帶入該變數 算出東西來 它是把整個()裡的東西 都在該變數的位置取代掉 也就是說 squared(a)a*a-a*a 用squared(++x) 這樣的式子 經由編譯器展開 會變成這樣 i = ++x*++x-++x*++x; 至於為什麼會是-24 我也不清楚... 因為我對於運算的優先順序沒有深入的研究 原因在於我認為....該用括號括起來的式子 就算運算有優先權 也要括起來 括起來的話 就會強迫裡面的東西先完成 至於 ++x*++x-++x*++x;的運算順序 我也想知道 XD 誰來解釋一下 -- VICTOR工作室 URL : http://www.kinmen.info/vic/ C/C++ Visual Basic 6.0 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.116.64.30

220.130.208.168 08/28, , 1F
請看十誡第八誡!展開那種式子的結果是
220.130.208.168 08/28, 1F

220.130.208.168 08/28, , 2F
undefined behavior,什麼都有可能。
220.130.208.168 08/28, 2F

220.130.208.168 08/28, , 3F
過幾天我會出第二版並增加一些說明。
220.130.208.168 08/28, 3F

220.130.208.168 08/28, , 4F
這個例子不錯。可以拿來做錯誤示範:-)叫人盡量
220.130.208.168 08/28, 4F

220.130.208.168 08/28, , 5F
別用 macro 定義「假函式」
220.130.208.168 08/28, 5F
文章代碼(AID): #1349YKPP (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1349YKPP (C_and_CPP)