gpt4 book ai didi

c - c 中 #define 的前/后增量

转载 作者:行者123 更新时间:2023-11-30 20:14:34 25 4
gpt4 key购买 nike

我编写了一小段代码,其中使用了带有增量运算符的#define。代码是

#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
The result is 2.

$ ./a.out
2
The result is 6.

还解释了代码的工作原理。

最佳答案

您的宏在预处理器展开后将如下所示:

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

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

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

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

我建议你将宏重写为函数

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

关于c - c 中 #define 的前/后增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25830879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com