x
当我在左侧后增量时,我可以在布尔表达式的两侧使用它吗?
有问题的行是:
if(x-- > 0 && array[x]) { /* … use x … */ }
这是通过标准定义的吗?array[x] 将使用新值x
还是旧值?
x
当我在左侧后增量时,我可以在布尔表达式的两侧使用它吗?
有问题的行是:
if(x-- > 0 && array[x]) { /* … use x … */ }
这是通过标准定义的吗?array[x] 将使用新值x
还是旧值?
这取决于。
如果&&
是通常的短路逻辑运算符,那很好,因为有一个序列点。array[x]
将使用新值。
如果&&
是用户(或库)定义的重载运算符,则不存在短路,也不能保证 的求值x--
和 的求值之间的序列点array[x]
。鉴于您的代码,这看起来不太可能,但如果没有上下文,则无法确定。我认为,通过仔细定义array
,以这种方式安排它是可能的。
这就是为什么重载几乎总是一个坏主意的原因operator&&
。
顺便说一句,if ((x > 0) && array[--x])
具有非常相似的效果(再次假设没有运算符重载恶作剧),并且在我看来更清晰。不同之处在于是否x
会减少超过 0,您可能依赖也可能不依赖它。
是的,它定义明确。&&
引入一个序列点。