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

时间:2018-12-02 15:05:01

标签: c increment undefined-behavior post-increment pre-increment

我经历了C代码段产生的一些棘手和异常行为,并且遇到了一个异常输出。

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

我认为这将导致344,但输出为553。

我搜索了原因,显然是由于某些语句的不确定行为,特别是如果在单个语句中对同一变量进行了多次更改。

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

在SO的某处可能有一个答案,但我不知道确切搜索什么。 谢谢。

1 个答案:

答案 0 :(得分:0)

这里的问题是函数调用的参数的评估顺序,特定的编译器可以按照哪种顺序认为评估合理。因此,取决于各种因素,您可能会有不同的结果。

请注意,通常对参数的评估是未排序的,并且可能会因平台,编译器或许多其他因素而异。

  

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

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

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

通过这种方式,您可以正确地预测结果,因为您可以正确查看评估顺序,而不必依赖编译器的评估顺序。