Foo*_*Bah 5

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

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

  • @Shahbaz G ++是一个C++编译器,其规则有很大不同.你应该阅读规范,这个领域有点具体.在gcc [C前端,注意问题集中于C]你应该得到两个案例的`f(1,1)`. (2认同)

und*_*gor 3

标准(草案) [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两次,因此在这样的平台上您有未定义的行为。