代码如下:
#include <iostream> using namespace std; #define product(x) (x*x) int main() { int i = 3, n; n = product(++i); printf("n = %d \n", n); system("pause"); return 0; }
我的理解:
当进行到product(++i)时,被替换为:(++i)*(++i),先进行小括号里面的运算,有两个小括号,按照乘号(*)的结合性从左到右(right to left),此时:i = 3;所以:(++i=4)*(++i=5)=20.但,实际运行结果是:
请帮我解释一下乘法运算的过程,谢谢。
宏定义,不能当作一般的函数来使用。
宏定义只是便于代码编写,在编译后,宏已经不存在了。
你把调用的代码修改成:
n=product(2+3)
这样不会得到25,实际结果是:11。
n = product(2+3)
等价于
n=2+3*2+3
你的宏定义在安全行,应该修改为:
#define product(x) (x) * (x)
另外:
n=product(++i)
展开后变成:
n=++i*++i
等价于:
++i;
++i;
i*i;
假如你把product写成函数:
int product(int x)
{
return x*x;
}
那么:
product(2+3)为25
i=3;
product(++i)为16.
你写的宏展开好像不对,因为当我把++i,换成i++后,运行的结果是:9,而不是16。
这怎么回事呢?
@扎西德勒: 哦,这个我搞错了。
i++:是先使用,后自增
++i:是先自增后使用。
i = 3;
n = product(i++)
等价于:
n=i++*i++
定义两个变量:
n=a*b,其中a=i++,b=i++;
那么过程是:
a=i;
b=i;
i=i+1;
i=i+1;
n=a*b;
换作++i的话:
i=i+1;
i=i+1;
a=i;
b=i;
n=a*b;
这个确实理解起来很难,而且,这也是C语言的难点之一。
你有兴趣,可以把这段代码通过反汇编的方式查看编译后的EXE文件,可以看到汇编代码就是我说的这个策略。
@笨笨蜗牛:
谢谢,学习了。
i是一个变量,在进行表达式:(++i)*(++i)时,从右到左进行两个小括号的内的计算:(++i)*(++i),左边的i第一次加1,此时i这个变量存储的值是:4,然后进行乘号左边小括号内的计算,此时i变量存储的值是:5。所以两个i相乘时是25。
写这种代码基本上是自我折腾 :)
嘿嘿
请指教……
我想弄清楚调用宏定义时,所执行的具体过程。
@扎西德勒: 如果只是想看宏的展开,可以$gcc -E test.c -o test.i 去看预处理之后的文件。
对于i++, ++i,在加上在函数的参数中使用,有些行为C++标准是没有定义的。
所以在写代码是最好避免写出这种有歧义的代码。
@Jerry Chou: 嗯,谢谢,我是想看看展开的宏。