作者StubbornLin (Victor)
看板C_and_CPP
標題Re: [FAQ&FME] C 語言新手十誡
時間Sun Aug 28 00:55:46 2005
※ 引述《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
1F:推 khoguan:請看十誡第八誡!展開那種式子的結果是220.130.208.168 08/28
2F:→ khoguan:undefined behavior,什麼都有可能。220.130.208.168 08/28
3F:→ khoguan:過幾天我會出第二版並增加一些說明。220.130.208.168 08/28
4F:→ khoguan:這個例子不錯。可以拿來做錯誤示範:-)叫人盡量220.130.208.168 08/28
5F:→ khoguan:別用 macro 定義「假函式」220.130.208.168 08/28