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