R..*_*R.. 14 c undefined-reference sequence-points
以下代码中的两个赋值之间是否存在序列点:
f(f(x=1,1),x=2);
Run Code Online (Sandbox Code Playgroud)
不,没有.在这种情况下,标准确实含糊不清.
如果你想确认一下,gcc有这个非常酷的选项-Wsequence-point
,在这种情况下,它会警告你操作可能是未定义的
标准(草案) [6.5.2.2, 10]的相关引用是:
函数指示符、实际参数和实际参数中的子表达式的求值顺序未指定,但在实际调用之前有一个序列点。
f
因此,对于您的表达式,可以在第二个参数之前评估第一个参数(特别是对 的调用);例如:
(x = 1, 1), f <sp> call, (x = 2), f <sp> call
Run Code Online (Sandbox Code Playgroud)
或者,可以在第二个参数之后对其进行评估;例如:
(x = 2), (x = 1, 1), f <sp> call, f <sp> call
Run Code Online (Sandbox Code Playgroud)
[函数调用本身可以(并且很可能会)包含更多序列点(特别是如果它包含语句return
)。]
根据这一点,分配之间是否存在序列点。这取决于平台(“未指定”)。
由于在第二种情况下,您在两个序列点之间分配了x
两次,因此在这样的平台上您有未定义的行为。