这些作业之间是否有一个序列点?

以下代码中的两个赋值之间是否存在序列点:

f(f(x=1,1),x=2); 

(草案)标准 [6.5.2.2,10]的相关引用是:

函数指示符的评估顺序,实际参数和实际参数中的子表达式是未指定的,但在实际调用之前有一个序列点。

所以对于你的表达式,可以在第二个参数之前计算第一个参数(特别是对f的调用); 例如:

 (x = 1, 1), f  call, (x = 2), f  call 

或者,它可以在第二个参数之后进行评估; 例如:

 (x = 2), (x = 1, 1), f  call, f  call 

[函数调用本身可以(并且很可能会)包含更多序列点(特别是如果它包含return语句)。

根据不同,在分配之间有一个序列点。 这取决于平台(“未指定”)。

因为在第二种情况下,您在两个序列点之间分配x两次,所以在这样的平台上有未定义的行为。

不,没有。 在这种情况下,标准确实含糊不清。

如果你想确认一下,gcc有这个非常酷的选项-Wsequence-point ,在这种情况下它会警告你操作可能是未定义的

在函数调用开始时和结束时有序列点。 但是因为函数参数的操作顺序是实现定义的,所以你不能保证f(x=1,1)将在x=2之前执行。

还要注意,在函数调用的情况下,不是引入序列点的逗号运算符

有一个序列点,但外部函数参数的评估顺序(及其副作用)仍未定义。 该实现可以自由地首先评估内部f(),其副作用x = 1,或第二个参数,其副作用x = 2。

是的,因为在函数调用之前和之后都有一个序列点。

标准§1.0.17说:

在调用函数时(无论函数是否为内联函数),在评估函数体中任何表达式或语句之前发生的所有函数参数(如果有)之后,都会有一个序列点。 在复制返回值之后和执行函数之外的任何表达式之前,还有一个序列点。

是的,由于逗号操作符会有一个序列点但是由于函数参数的评估是未定义的,因此仍然无法定义结果,因此无法预测此表达式将生成的值……..表示未定义的行为