不确定地排序的表达式
函数调用 f(a)
总是意味着参数的评估和指示符(此处为 f
和 a
)和实际调用之间的序列点。如果两个这样的调用未被排序,则两个函数调用是不确定的顺序,即一个在另一个之前执行,并且未指定顺序。
unsigned counter = 0;
unsingned account(void) {
return counter++;
}
int main(void) {
printf("the order is %u %u\n", account(), account());
}
在评估 printf
参数期间对 counter
的这种隐含的双重修改是有效的,我们只是不知道哪个调用首先出现。由于订单未指定,可能会有所不同,也不能依赖。所以打印输出可能是:
订单是 0 1
要么
订单是 1 0
上面没有中间函数调用的类似语句
printf("the order is %u %u\n", counter++, counter++); // undefined behavior
具有未定义的行为,因为 counter
的两个修改之间没有序列点。