gpt4 book ai didi

c - C 中未定义的行为 [示例]

转载 作者:行者123 更新时间:2023-11-30 19:28:51 24 4
gpt4 key购买 nike

我一直在研究 C 代码片段产生的一些棘手且不寻常的行为,并且遇到了一个导致不寻常输出的行为。

int main()
{
int i=3;
printf("%d%d%d", i, ++i, i++);
return 0;
}

我以为这会导致 344,但输出是 553。

我搜索了原因,显然是因为某些语句的未定义行为,特别是在单个语句中对同一变量进行了多次更改的情况下。

但是,您如何预测输出是什么? 553 是如何计算并证明是上述代码片段的答案的?

SO 上的某个地方可能有答案,但我不知道到底要搜索什么。谢谢。

最佳答案

这里的问题是函数调用的参数的求值顺序,特定的编译器可以决定它认为求值合理的顺序。因此,根据不同的因素,您可能会得到不同的结果。

请注意,通常参数的计算是无序的,并且可能会因平台、编译器或许多其他因素而异。

However, how do you predict what the output would be? And how is 553 computed and justified as the answer to the above code snippet?

您无法预测此行为。通常最好不要让未定义的行为改变代码的结果。这可以通过将代码划分为多个声明来完成:

int i = 3;
int a = ++i;
int b = i++;
printf("%d%d%d", i, a, b);

这样您就可以正确地预测结果,因为您可以正确地看到计算顺序,而无需依赖编译器生成的计算顺序。

关于c - C 中未定义的行为 [示例],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53581491/

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