不确定地排序的表达式

函数调用 f(a) 总是意味着参数的评估和指示符(此处为 fa)和实际调用之间的序列点。如果两个这样的调用未被排序,则两个函数调用是不确定的顺序,即一个在另一个之前执行,并且未指定顺序。

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 的两个修改之间没有序列点。