我经历了C代码段产生的一些棘手和异常行为,并且遇到了一个异常输出。
int main()
{
int i=3;
printf("%d%d%d", i, ++i, i++);
return 0;
}
我认为这将导致344,但输出为553。
我搜索了原因,显然是由于某些语句的不确定行为,特别是如果在单个语句中对同一变量进行了多次更改。
但是,您如何预测输出将是什么? 553是如何计算和证明为上述代码段的答案?
在SO的某处可能有一个答案,但我不知道确切搜索什么。 谢谢。
答案 0 :(得分:0)
这里的问题是函数调用的参数的评估顺序,特定的编译器可以按照哪种顺序认为评估合理。因此,取决于各种因素,您可能会有不同的结果。
请注意,通常对参数的评估是未排序的,并且可能会因平台,编译器或许多其他因素而异。
但是,您如何预测输出将是什么? 553是如何计算和证明为上述代码段的答案?
您无法预测此行为。通常最好不要让未定义的行为改变代码的结果。这可以通过将代码分成多个声明来实现:
int i = 3;
int a = ++i;
int b = i++;
printf("%d%d%d", i, a, b);
通过这种方式,您可以正确地预测结果,因为您可以正确查看评估顺序,而不必依赖编译器的评估顺序。