常见非顺序点
大多数二元操作符(除了 || 和 &&)
函数调用的各个实参
用这个例子理解为什么多个副作用的顺序是不定的
int x=1, y;
y = x++ + x++;
有两种可能的结果:
1)y=3(第一个x++的值为1,第二个x++的值为2)
个人认为,这发生在两个x++运行在同一CPU core。
第一个x++的x的初值都为1,第二个x++的x的初值都为2。
2)y=2(第一个x++的值为1,第二个x++的值为1)
个人认为,这发生在两个x++运行在不同的CPU core上。x的初值都为1。
因为有两种可能的结果,所以称为“未定义”。
“结果未定义”发生的条件
1)表达式中某变量被修改了2次或以上
2)表达式中某变量被修改了1次,后又被读取