無序的表達
Version >= C11
以下表示式未被排除 :
a + b;
a - b;
a * b;
a / b;
a % b;
a & b;
a | b;
在上面的例子中,表達 a
可以在表達 b
之前或之後進行評估,b
可以在 a
之前進行評估,或者如果它們對應於幾個指令,它們甚至可以混合。
類似的規則適用於函式呼叫:
f(a, b);
這裡不僅 a
和 b
未被排序(即函式呼叫中的 ,
運算子不產生序列點),還有 f
,即確定要呼叫的函式的表示式。
可以在評估後立即應用副作用,或者延遲到稍後的點。
表示式如
x++ & x++;
f(x++, x++); /* the ',' in a function call is *not* the same as the comma operator */
x++ * x++;
a[i] = i++;
要麼
x++ & x;
f(x++, x);
x++ * x;
a[i++] = i;
將產生*未定義的行為,*因為
- 必須對物件的修改和對它的任何其他訪問進行排序
- 未指定評估順序和應用副作用 1 的順序。
1 執行環境狀態的任何變化。