gpt4 book ai didi

c - GCC 和 VC++ 中的宏

转载 作者:行者123 更新时间:2023-11-30 20:05:40 26 4
gpt4 key购买 nike

我在 VC++ 和 GCC 中编译了这段代码,它产生了不同的输出,如果有人能指出我哪里出了问题,我将不胜感激。

#include "stdio.h"

#define Cube(x) x*x*x

int main(void){

int x=5;
printf("%d\r\n", Cube(x++));

return 0;
}

在GCC中,显示值为210(=5*6*7),在VC++2010中显示值为125(=5*5*5)。

如果我这样做,

#include "stdio.h"

#define Cube(x) x*x*x

int main(void){

int x=5;
printf("%d\r\n", Cube(++x));

return 0;
}

VC++ 打印 512 (=8*8*8),GCC 打印 392 (=7*7*8)。

如果有人能说出发生了什么,我们将不胜感激。

最佳答案

线路

printf("%d\r\n", Cube(x++));

预处理为:

printf("%d\r\n", x++*x++*x++));

这是导致未定义行为的原因。

printf("%d\r\n", ++x*++x*++x));

也是导致未定义行为的原因。

参见
Why the output of this program is 41? is it undefined behavior?
Why are these constructs (using ++) undefined behavior?

您可以通过将Cube转换为函数来避免该问题。下面的程序表现良好。

#include "stdio.h"

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

int main(void)
{
int x=5;
printf("%d\r\n", Cube(x++));
printf("%d\r\n", Cube(++x));

return 0;
}

关于c - GCC 和 VC++ 中的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29784202/

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