在c中使用#define进行前/后增量

时间:2014-09-14 07:01:49

标签: c c-preprocessor pre-increment

我写了一小段代码,其中我使用#define和increment运算符。代码是

#include <stdio.h>
#define square(a) ((a)*(a))

int main ()
{
    int num , res ;
    scanf ("%d",&num ) ;
    res = square ( num++ ) ;
    printf ( "The result is %d.\n", res ) ;
    return 0 ;
}

但是在用gcc编译时,我得到了以下注释和警告:

defineTest.c:8:20: warning: multiple unsequenced modifications to 'num' [-Wunsequenced]
    res = square ( num++ ) ;
                      ^~
defineTest.c:2:21: note: expanded from macro 'square'
    #define square(a) ((a)*(a))
                        ^
1 warning generated.

请解释警告和注意事项。 我得到的输出是:

  

$ ./a.out
  1
  结果是2.

     

$ ./a.out
  2
  结果是6。

还解释代码是如何工作的。

1 个答案:

答案 0 :(得分:2)

在预处理程序扩展后,您的宏将如下所示:

((a++)*(a++))

请注意,a++a = a + 1相同,因此您可以将扩展宏重写为:

((a = a + 1)*(a = a + 1))

您在一个语句中两次更改a(或确切地说num)的值,这会生成警告,因为这是未定义的行为。

我建议你将宏重写为函数

int square(int x)
{
    return x*x;
}