取表达式:
(x++, y) + (y++, x)
从左到右评估:
x++ // yield 0, schedule increment of x
, // sequence point: x definitely incremented now
y // yield 0
y++ // yield 0, schedule increment of y
// explode because you just read from y and wrote to y
// with no intervening sequence point
标准中没有任何内容禁止这样做,所以整个事情都有未定义的行为。
对比这个伪代码:
f() { return x++, y; }
g() { return y++, x; }
f() + g()
根据 C99 (5.1.2.3/2),对f
和g
本身的调用都算作副作用,并且函数调用运算符在进入函数之前包含一个序列点。这意味着函数执行不能交错。
在“并行评估事物”模型下:
f() // arbitrarily start with f: sequence point; enter f
g() // at the same time, start calling g: sequence point
由于执行f
计数本身就是副作用,因此序列点会g()
暂停执行,直到f
返回。因此,没有未定义的行为。