看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
khoguan:請看十誡第八誡!展開那種式子的結果是220.130.208.168 08/28
khoguan:undefined behavior,什麼都有可能。220.130.208.168 08/28
khoguan:過幾天我會出第二版並增加一些說明。220.130.208.168 08/28
khoguan:這個例子不錯。可以拿來做錯誤示範:-)叫人盡量220.130.208.168 08/28
khoguan:別用 macro 定義「假函式」220.130.208.168 08/28