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