我写了一小段代码,其中我使用#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。
还解释代码是如何工作的。
答案 0 :(得分:2)
在预处理程序扩展后,您的宏将如下所示:
((a++)*(a++))
请注意,a++
与a = a + 1
相同,因此您可以将扩展宏重写为:
((a = a + 1)*(a = a + 1))
您在一个语句中两次更改a
(或确切地说num
)的值,这会生成警告,因为这是未定义的行为。
我建议你将宏重写为函数
int square(int x)
{
return x*x;
}