C宏 - 意外结果

时间:2016-12-10 19:05:29

标签: c

#include<stdio.h>
#define SQ(x) ((x)*(x))

main()
{
    int i = 1;
    while( i<=5 ){
        printf("result : %d\n", SQ(i++));
    }
}

执行窗口:

结果:2 结果:12 结果:30

我打算这样做:

结果:1 结果:4 结果:9 结果:16 结果:25

我应该如何修改此代码?

2 个答案:

答案 0 :(得分:1)

SQ(i++) -> (i++)*(i++)

使用此:

printf("result : %d\n", SQ(i));
i++;

答案 1 :(得分:0)

宏可以多次评估其参数。这是因为#define以文本方式替代,而不考虑C语言规则。预处理器用{/ p>替换SQ(i++)

((i++)*(i++))

在此表达式中,i++完成两次,而不是一次。

这就是为什么不推荐使用#define的原因。为您想要的行为写一个常规函数。或者,使用SQ参数调用i,并且只有在通话后写下i++

SQ(i);
i++;