带参宏定义
本帖最后由 张世来4610484 于 2020-2-26 17:29 编辑问题:求1~10平方之和并逐个输出
错误示范 使用宏:
#include <stdio.h>
#define FUN(a)a*a
void main ()
{
int k=1,s=0;
while (k<=10)
printf("%d",s=s+FUN(k++));
}
输出结果为:1103584 165
书本分析如下:预处理程序将程序中的实参FUN替换成(k++)*(k++),由于C语言中,实参的求值顺序是从右向左,
因此程序运行结果为:
第一次循环:(k++)*(k++)为1*1,k再有两次加1,变成3,s值为1;
第二次循环:(k++)*(k++)为3*3,k再有两次加1,变成5,s值为10;
第三次循环:(k++)*(k++)为6*5,k再有两次加1,变成7,s值为35;
第四次循环:(k++)*(k++)为8*7,k再有两次加1,变成9,s值为84;
第五次循环:(k++)*(k++)为10*9,k再有两次加1,变成11,s值为165.
我有两个问题,第一是,实参的求值顺序是从右向左,是什么意思,怎么没有听说过
第二个是,从第三个循环开始,书本是不是就写错了,不应该两次加一是5*5,7*7,9*9这种吗,
怎么写成6*5 对,书本有书写错误,应该是
第三次循环:(k++)*(k++)为5*5,k再有两次加1,变成7,s值为35;
第四次循环:(k++)*(k++)为7*7,k再有两次加1,变成9,s值为84;
第五次循环:(k++)*(k++)为9*9,k再有两次加1,变成11,s值为165.
ANSI C有规定:函数参数求值顺序是不确定的,编译器制造者可以随意实现。大多数主流编译器求值顺序都是从右向左
页:
[1]