以下表达式是无序列的:
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执行环境状态的任何更改。