作者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