11

x当我在左侧后增量时,我可以在布尔表达式的两侧使用它吗?

有问题的行是:

 if(x-- > 0 && array[x]) { /* … use x … */ }

这是通过标准定义的吗?array[x] 将使用新值x还是旧值?

4

2 回答 2

13

这取决于。

如果&&是通常的短路逻辑运算符,那很好,因为有一个序列点。array[x]将使用新值。

如果&&是用户(或库)定义的重载运算符,则不存在短路,也不能保证 的求值x--和 的求值之间的序列点array[x]。鉴于您的代码,这看起来不太可能,但如果没有上下文,则无法确定。我认为,通过仔细定义array,以这种方式安排它是可能的。

这就是为什么重载几乎总是一个坏主意的原因operator&&

顺便说一句,if ((x > 0) && array[--x])具有非常相似的效果(再次假设没有运算符重载恶作剧),并且在我看来更清晰。不同之处在于是否x会减少超过 0,您可能依赖也可能不依赖它。

于 2010-10-28T15:43:41.763 回答
11

是的,它定义明确。&&引入一个序列点。

于 2010-10-28T15:35:11.760 回答