不確定地排序的表示式

函式呼叫 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 的兩個修改之間沒有序列點。