让我举一个例子:
a = ++a;
据说上面的语句有未定义的行为(我已经阅读了关于 UB on SO 的文章)
但根据优先规则运算符前缀++
优先级高于赋值运算符=
so a
应首先递增,然后分配回 a。那么每一个评价都是已知的,那为什么是UB呢?
这里要理解的重要一点是,运营商可以产生价值并且还可以有副作用.
例如++a
产生(评估为)a + 1
,但它也有增加的副作用a
。同样适用于a = 5
(计算结果为 5,同时设置a
to 5).
所以这里有两个副作用,它们改变了a
,两者都发生在序列点之间(可见的分号和上一个语句的结尾)。
由于运算符优先级,两个运算符的求值顺序是明确定义的,但这并不重要,因为处理它们的副作用的顺序仍然是未定义的。
因此,UB。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)