【发布时间】:2019-09-28 20:57:17
【问题描述】:
我已经学习 C 大约一年了,我在上面玩的时候遇到了这个问题。我首先认为这可能是分配优先的情况(即 x=10 先发生),但后来我尝试了
printf("%d %d %d", x==5, x=10, x<6);
它输出
0 10 1。有人可以向我解释为什么/发生了什么,因为这对我来说似乎非常莫名其妙,我开始认为这可能是未定义的行为?
【问题讨论】:
-
这是未定义的行为;任何结果都是可能的,并且与其他任何结果一样可以接受。
-
为什么是未定义的行为,是不是因为我在 printf 中赋值?
-
是的;未指定评估参数的顺序(甚至未定义实现),并且您尝试更改
x的值以及在评估参数列表时在比较中使用该值,因此行为未定义.这是printf("%d %d %d\n", x--, x, ++x);语句类型的一个微小变化——这也是未定义的行为,任何结果都是可以接受的。 -
@DavidC.Rankin: C11 §6.5.2.2 Function calls ¶10: 在函数指示符和实际参数的评估之后但在实际调用之前有一个序列点。调用函数(包括其他函数调用)中的每个求值,如果在被调用函数的主体执行之前或之后没有特别排序,则相对于被调用函数的执行是不确定的。94)。脚注 94 说:换句话说,函数执行不会相互“交错”。
-
就是这个!
标签: c printf undefined-behavior