不確定地排序的表示式
函式呼叫 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
的兩個修改之間沒有序列點。