C语言无序列表达

示例

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