是`x--> 0&& array [x]`C ++中明确定义的行为?

时间:2010-10-28 15:33:43

标签: c++ undefined-behavior post-increment

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

有问题的一行是:

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

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

2 个答案:

答案 0 :(得分:13)

取决于。

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

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

这就是为什么重载array几乎总是一个坏主意。

顺便说一下,operator&&具有非常相似的效果(同样,假设没有操作员超载恶作剧),在我看来更清楚。不同之处在于if ((x > 0) && array[--x])是否会在0之后递减,您可能会或可能不会依赖它。

答案 1 :(得分:11)

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