是`x--> 0 && array [x]`在C++中定义良好的行为?

kni*_*ttl 11 c++ undefined-behavior post-increment

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

有问题的一行是:

 if(x-- > 0 && array[x]) { /* … use x … */ }
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*sop 13

这取决于.

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

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

这就是为什么超载几乎总是一个坏主意operator&&.

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


Pra*_*rav 11

是的,它定义明确.&&介绍一个序列点.

  • @knittl:新的价值. (3认同)