首页 新闻 会员 周边 捐助

C++中的乘法运算问题?

0
悬赏园豆:10 [已解决问题] 解决于 2012-06-06 09:32

代码如下:

#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.但,实际运行结果是:

请帮我解释一下乘法运算的过程,谢谢。

c++
waynewuzhenbo的主页 waynewuzhenbo | 初学一级 | 园豆:189
提问于:2012-06-04 16:53
< >
分享
最佳答案
1

宏定义,不能当作一般的函数来使用。

宏定义只是便于代码编写,在编译后,宏已经不存在了。

 

你把调用的代码修改成:

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.

收获园豆:8
无之无 | 大侠五级 |园豆:5095 | 2012-06-04 17:36

你写的宏展开好像不对,因为当我把++i,换成i++后,运行的结果是:9,而不是16。

这怎么回事呢?

waynewuzhenbo | 园豆:189 (初学一级) | 2012-06-04 23:22

@扎西德勒: 哦,这个我搞错了。

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文件,可以看到汇编代码就是我说的这个策略。

无之无 | 园豆:5095 (大侠五级) | 2012-06-05 08:09

@笨笨蜗牛: 

谢谢,学习了。

waynewuzhenbo | 园豆:189 (初学一级) | 2012-06-06 09:31
其他回答(2)
0

i是一个变量,在进行表达式:(++i)*(++i)时,从右到左进行两个小括号的内的计算:(++i)*(++i),左边的i第一次加1,此时i这个变量存储的值是:4,然后进行乘号左边小括号内的计算,此时i变量存储的值是:5。所以两个i相乘时是25。

waynewuzhenbo | 园豆:189 (初学一级) | 2012-06-04 17:11
0

写这种代码基本上是自我折腾 :)

收获园豆:2
Jerry Chou | 园豆:2642 (老鸟四级) | 2012-06-04 17:13

嘿嘿

请指教……

支持(0) 反对(0) waynewuzhenbo | 园豆:189 (初学一级) | 2012-06-04 17:53

我想弄清楚调用宏定义时,所执行的具体过程。

支持(0) 反对(0) waynewuzhenbo | 园豆:189 (初学一级) | 2012-06-04 18:07

@扎西德勒:  如果只是想看宏的展开,可以$gcc -E  test.c  -o test.i 去看预处理之后的文件。

对于i++, ++i,在加上在函数的参数中使用,有些行为C++标准是没有定义的。

所以在写代码是最好避免写出这种有歧义的代码。

支持(0) 反对(0) Jerry Chou | 园豆:2642 (老鸟四级) | 2012-06-04 20:32

@Jerry Chou: 嗯,谢谢,我是想看看展开的宏。

支持(0) 反对(0) waynewuzhenbo | 园豆:189 (初学一级) | 2012-06-04 22:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册