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

发布于 2024-09-29 09:04:24 字数 196 浏览 5 评论 0原文

当我在左侧后递增布尔表达式时,可以在布尔表达式的两侧使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

只是一片海 2024-10-06 09:04:24

这取决于。

如果 && 是通常的短路逻辑运算符,那么没关系,因为有一个序列点。 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 of x-- and the evaluation of array[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 of array, 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 not x gets decremented past 0, which you may or may not be relying on.

血之狂魔 2024-10-06 09:04:24

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

Yes, it is well defined. && introduces a sequence point.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文