(关于C语言预处理)这个程序打印结果为什么不是1,4,9,16,25?而是1,9,25呢?

[复制链接]
查看11 | 回复5 | 2012-8-5 15:27:04 | 显示全部楼层 |阅读模式
因为在编译时,C语言会将程序中的SQ(i++)替换为 (i++)*(i++),再进行编译就是 printf("%d\n",(i++)*(i++));相当于计算完i的乘积后,自加了2次,所以得到的只有1,9,25...
回复

使用道具 举报

千问 | 2012-8-5 15:27:04 | 显示全部楼层
这里牵涉到宏定义的简单替换,如果你把SQ(y)替换回远程序的话printf("%d\n",SQ(i++));======printf("%d\n",((i++)*(i++)));也就是说这里的i++进行了两次,所以结果是1,9,25,你可以用调试来逐句运行,就可以看出来...
回复

使用道具 举报

千问 | 2012-8-5 15:27:04 | 显示全部楼层
要搞明白宏只是简单的替换,你如果替换一下看看你就明白了。所以等价于:int i=1;while(i<=5){printf("%d\n",(i++)*(i++));}...
回复

使用道具 举报

千问 | 2012-8-5 15:27:04 | 显示全部楼层
宏是直接展开的,不会像函数那样计算第一次printf("%d\n",SQ(i++));时展开是这样的printf("%d\n",((i++)*(i++)));输出一次i加了两次。...
回复

使用道具 举报

千问 | 2012-8-5 15:27:04 | 显示全部楼层
因为是i++,所以1是没有疑问的。到第二轮时,前一个i++ = 2,后一个i++ = 3了。所以是9,下面以此类推...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行