让我举一个例子:
a = ++a;
据说上面的陈述有不明确的行为(我已经在SO上读过关于UB的文章)
但是根据优先级规则,运算符前缀的++优先级高于赋值运算符=
所以a应先增加,然后再分配给a.所以每个评估都是已知的,为什么它是UB?
这里要理解的重要一点是,操作员可以产生价值,也可能产生副作用.
例如,++a生成(计算到)a + 1,但它也具有递增的副作用a.同样适用a = 5(评估为5,也将值设置a为5).
所以你在这里有两个副作用,它们改变了a序列点之间发生的值(可见分号和前一个语句的结尾).
由于运算符优先级,两个运算符的计算顺序是明确定义的,因此处理副作用的顺序仍未定义,这无关紧要.
因此UB.
| 归档时间: |
|
| 查看次数: |
412 次 |
| 最近记录: |