無序的表達

Version >= C11

以下表示式未被排除

a + b;
a - b;
a * b;
a / b;
a % b;
a & b;
a | b;

在上面的例子中,表達 a 可以在表達 b 之前或之後進行評估,b 可以在 a 之前進行評估,或者如果它們對應於幾個指令,它們甚至可以混合。

類似的規則適用於函式呼叫:

f(a, b);

這裡不僅 ab 未被排序(即函式呼叫, 運算子產生序列點),還有 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 執行環境狀態的任何變化。