表达式求值依赖无确定顺序的副作用
C++-Undefined-Behavior-28
示例:
int a = 0;
int b = a + a++; // Undefined behavior
例中加法运算符左右子表达式无明确的求值顺序,如果左子表达式先求值,b 的值是 0,如果右子表达式先求值,b 的值可能是 1 也可能是 0,因为 a++ 的值是 0,但 a++ 的副作用在表达式求值过程中何时生效也是不确定的。
又如:
volatile int* p = foo();
int n = *p + *p; // Undefined behavior
例中 n 的值在数学上应是 *p 的二倍,但由于 p 指向 volatile 数据,结果可能不符合预期的数学关系。
依据
ISO/IEC 14882:2003 5(4)-undefined