序列点和运算符优先级之间的差异?0_o

Mr.*_*bis 4 c++

让我举一个例子:

a = ++a;

据说上面的陈述有不明确的行为(我已经在SO上读过关于UB的文章)

但是根据优先级规则,运算符前缀的++优先级高于赋值运算符=

所以a应先增加,然后再分配给a.所以每个评估都是已知的,为什么它是UB?

Jon*_*Jon 9

这里要理解的重要一点是,操作员可以产生价值,也可能产生副作用.

例如,++a生成(计算到)a + 1,但它也具有递增的副作用a.同样适用a = 5(评估为5,也将值设置a为5).

所以你在这里有两个副作用,它们改变了a序列点之间发生的值(可见分号和前一个语句的结尾).

由于运算符优先级,两个运算符的计算顺序是明确定义的,因此处理副作用的顺序仍未定义,这无关紧要.

因此UB.