无序的表达

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 执行环境状态的任何变化。