这是未定义的C行为吗?

我们的课由C程序设计教授问这个问题:

您将获得代码:

int x=1;
printf("%d",++x,x+1);

它总会产生什么输出?

大多数学生说未定的行为。任何人都可以帮助我明白为什么会是这样?

感谢编辑和答案,但我仍然困惑。

在每个合理情况下,产出可能为2。在现实中,你所拥有的是未定义的行为。

具体来说,标准说:

Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.

在计算函数的参数之前有一个序列点,并且在所有参数已经计算完毕(但是函数尚未调用)之后是一个序列点。在这两个之间(即,当参数被评估时)没有序列点(除非参数是表达式在内部包括一个,例如使用&& ||或,运算符)。

这意味着对printf的调用正在读取先前值,既确定存储的值(即x),又确定第二个参数的值(即x 1)。这显然违反了上面引用的要求,导致未定义的行为。

事实上,您提供了一个额外的参数,没有给出转换说明符,不会导致未定义的行为。如果你为转换说明符提供较少的参数,或者如果(提升的)类型的参数与转换说明符的类型不一致,你会得到未定义的行为 – 但是传递一个额外的参数不会。

http://stackoverflow.com/questions/3450582/is-this-undefined-c-behaviour

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:这是未定义的C行为吗?