kni*_*ttl 11 c++ undefined-behavior post-increment
x
当我在左侧后增加它时,我可以在布尔表达式的两侧使用吗?
有问题的一行是:
if(x-- > 0 && array[x]) { /* … use x … */ }
Run Code Online (Sandbox Code Playgroud)
这是通过标准定义的吗?array [x]会使用新值x
还是旧值?
Ste*_*sop 13
这取决于.
如果&&
是通常的短路逻辑运算符,那么它很好,因为有一个序列点.array[x]
将使用新值.
如果&&
用户(或库)定义了重载运算符,则没有短路,也无法保证评估x--
和评估之间的序列点array[x]
.鉴于您的代码,这看起来不太可能,但如果没有上下文,则无法确定.我认为,通过仔细定义array
,可以这样安排.
这就是为什么超载几乎总是一个坏主意operator&&
.
顺便说一句,if ((x > 0) && array[--x])
有一个非常相似的效果(再次,假设没有操作员超载恶作剧),在我看来更清楚.不同之处在于是否x
会在0之后递减,您可能会或可能不会依赖它.