是`x--> 0 && C++ 中 array[x]` 定义明确的行为?
当我在左侧后递增布尔表达式时,可以在布尔表达式的两侧使用 x
吗?
有问题的一行是:
if(x-- > 0 && array[x]) { /* … use x … */ }
这是通过标准定义的吗? array[x] 会使用 x 的新值还是旧值?
Can I use x
on both sides of a boolean expression when I post-increment it on the left side?
The line in question is:
if(x-- > 0 && array[x]) { /* … use x … */ }
Is that defined through the standard? Will array[x] use the new value of x
or the old one?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这取决于。
如果
&&
是通常的短路逻辑运算符,那么没关系,因为有一个序列点。array[x]
将使用新值。如果
&&
是用户(或库)定义的重载运算符,则不存在短路,并且也不能保证x--< 的计算之间的序列点/code> 和 array[x] 的求值。鉴于您的代码,这看起来不太可能,但如果没有上下文,就无法确定。我认为,通过仔细定义
array
,可以这样安排它。这就是为什么重载
operator&&
几乎总是一个坏主意。顺便说一句, if ((x > 0) && array[--x]) 具有非常相似的效果(同样,假设没有运算符重载恶作剧),在我看来是更清晰。区别在于
x
是否递减到 0 以上,您可能依赖也可能不依赖。It depends.
If
&&
is the usual short-circuiting logical operator, then it's fine because there's a sequence point.array[x]
will use the new value.If
&&
is a user (or library) defined overloaded operator, then there is no short-circuit, and also no guarantee of a sequence point between the evaluation ofx--
and the evaluation ofarray[x]
. This looks unlikely given your code, but without context it is not possible to say for sure. I think it's possible, with careful definition ofarray
, to arrange it that way.This is why it's almost always a bad idea to overload
operator&&
.By the way,
if ((x > 0) && array[--x])
has a very similar effect (again, assuming no operator overloading shenanigans), and in my opinion is clearer. The difference is whether or notx
gets decremented past 0, which you may or may not be relying on.是的,它有明确的定义。
&&
引入了一个序列点。Yes, it is well defined.
&&
introduces a sequence point.