运算符优先级

7

2
没有顺序点... §6.2.2 表达式中子表达式的求值顺序未定义。 - obataku
谢谢,这似乎是原因,已在https://dev59.com/1E_Ta4cB1Zd3GeqPDLaz?rq=1中确认。请将您的评论作为答案,我会将其标记为最终答案。 - Fabio Dalla Libera
我已经将我的评论发布为答案 :-) - obataku
1个回答

4
正如我在我的评论中所述,没有序列点...
根据Stroustrup的《The C++ Programming Language, Third Edition》第6.2.2节中所述...

表达式中子表达式的求值顺序是未定义的。特别地,您不能假设表达式从左到右求值。

C++03标准的§5.4规定:

除非另有说明,否则各个运算符的操作数和各个表达式的子表达式的求值顺序以及副作用产生的顺序都是未指定的。在前一个序列点和下一个序列点之间,标量对象的存储值最多可以通过一个表达式的求值被修改一次。

您可以在这里了解更多关于序列点和未定义行为的知识。

2
你的引用是从哪里来的?我查看了C++03、C++11、C90、C99和C11,都没有6.2.2这样的内容。顺便说一下,C++03在5/4中说:“除非另有说明,否则单个运算符和子表达式的操作数的求值顺序以及单个表达式的副作用发生顺序是未指定的。”(我使用的版本已经从C++98进行了更改,所以可能没有改变)。与“未定义”不同的是,代码必须提供几种结果之一,并且不能开始启动一系列的守护进程。 - AProgrammer
Stroustrup的《C++程序设计语言》,尤其是第三版。表达式中子表达式的求值顺序是未定义的。特别地,您不能假设表达式从左到右进行求值。 - obataku
顺便说一下,在这种情况下,我认为你关于未指定未定义之间的区别的观点没有任何意义,因为在序列点之间的未定义评估顺序只意味着它可以按照环境希望的方式完成--即与未指定相同。顺序是未指定的,从而导致了未定义的行为 :-) - obataku
表达式中有很多序列点 - 然而评估的顺序是未指定的。序列点和评估顺序是两个不同的概念,即使它们在某些方面相关(序列点有时会影响评估顺序)。 - Michael Burr
3
这个标准对未指定的顺序(有一些顺序,但我们不知道是哪个)和未定义行为(任何 都可能发生)做了严格区分。斯特劳斯特鲁普在他的书中似乎没有那么严格。 - Bo Persson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接