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

Undefined Behaviour in C [with example]

我一直在研究 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);

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