C++;优先确定列表 快速搜索C++优先权会产生很多尝试。令人不安的是,它们都是不同的。大多数人肯定是错的,尽管是在一些小细节上

C++;优先确定列表 快速搜索C++优先权会产生很多尝试。令人不安的是,它们都是不同的。大多数人肯定是错的,尽管是在一些小细节上,c++,operators,language-lawyer,operator-precedence,C++,Operators,Language Lawyer,Operator Precedence,我将包括三个。第一,来自cppreference.com的声明有16个优先级别。Learn.cpp有18个。 普渡大学的一张简单的表格要简单得多。 这些都不是确定的,但当我查看ISO标准草案时,它甚至没有一个表格,说明您可以从上下文中找出它 我的问题是1)是否有一个好的、明确的优先顺序摘要 2) 有人能对这些表格所传达的所有不同的“事实”发表评论吗 例如,前两个同意后加/减与括号处于同一水平,这在实践中意味着什么 (x+1)++ 没有意义,因为x+1是一个rexpr,显然,括号中的表达式

我将包括三个。第一,来自cppreference.com的声明有16个优先级别。Learn.cpp有18个。 普渡大学的一张简单的表格要简单得多。

这些都不是确定的,但当我查看ISO标准草案时,它甚至没有一个表格,说明您可以从上下文中找出它

我的问题是1)是否有一个好的、明确的优先顺序摘要

2) 有人能对这些表格所传达的所有不同的“事实”发表评论吗

例如,前两个同意后加/减与括号处于同一水平,这在实践中意味着什么

(x+1)++
没有意义,因为x+1是一个rexpr,显然,括号中的表达式会使后增量无效

(*p)++;
我已经读到后增量比预增量高,所以我会把它放在()[]下面,等等。是什么使它相等(如果相等)


cppreference声称throw与赋值运算符处于同一级别。这显然是错误的,因为:

throw x += 5;
应该在抛出之前首先计算x+=5。learncpp有所不同,第三个来源根本没有提到作为操作符的throw

这是我第一次看到操作员。我承认我已经多年没有研究过这个标准了,但返回是一个声明,为什么不扔呢


任何对优先级表位的注释都会很好。

查看三个源,顺序基本相同。C++引用组抛出和:与赋值一起,这在学习CPP中是分开的。普渡大学的方法简单得多,但也不太具体

虽然看起来有点复杂,但我建议使用learncpp作为指导原则,因为它是最具体的。括号规则有点混乱;根据经验,使用它们时,应将其视为具有最高优先级

关于你问题的第二部分

(x+1)++;
当然不会做任何事情,因为(x+1)返回一个r值,而这个r值不能由++运算符赋值

(*p)++;
取消对指针p的引用,然后递增它所指向的变量。由于取消引用低于增量,如果没有括号,它将取消引用p,然后增加指针,从而导致未定义的行为

我认为它实际上是这样写的,postincrement与()相同,原因是不管怎样,括号都是先做的。当然,如果()的计算结果为r值,它将返回一个错误。Preincrement较低,因为如果需要,必须先执行()命令。比如说,

++(*x);
在这种情况下,必须先解除对x的引用,然后再对其进行递增

关于投掷的最后一个问题,表格从右到左列出了它的评估结果。你的一小段

throw x += 5;
将评估为

throw (x += 5);

它被列为运算符,因为它显然是一个表达式。其他更了解异常处理的人可能会解释这一点。

优先级不是语言规范的一部分。它是我们人类用来理解表达式含义的一种记忆工具,而不需要像实际的解析器那样递归地分析它

抛出,??:C++中的所有赋值都是语法生成分配表达式中的备选方案,定义如下:
 assignment-expression:
    conditional-expression
    logical-or-expression assignment-operator initializer-clause
    throw-expression
如果条件表达式定义为逻辑or表达式表达式赋值表达式,则initializer子句是另一个赋值表达式(当它不是括号内的init列表时),throw表达式定义为关键字
throw
,后跟可选的
赋值表达式

用人类的术语来说,我们将其描述为“相同的优先级,从右向左分组”

要重用示例

e=a
解析为
e=((a


错误?7:抛出3个
解析为
false?7:(抛出3)
,是的,
抛出x+=5的示例解析为
抛出(x+=5)

“这显然是错误的,因为:
抛出x+=5;
应该在抛出之前先计算x+=5。”它们具有相同的优先级没有错。它们具有从右到左的关联性。如果您想添加假想的圆括号,它被解析为
throw(x+=5)?:
,但是做了类似
x的事情?y:z=5
将被解析为
(x)?(y) :(z=5)
不是因为优先级,而是因为条件表达式可以是逻辑或表达式
表达式
赋值表达式。I与learncpp一起将
?:
放在赋值上方。标准(或至少N3936)说它也从右到左分组,而不是从左到右。@chris
b=5
在您的第一个示例中是
?:
的一部分,请参阅我在您前面的评论。请注意您的第一个问题(是否有一个好的、明确的优先级摘要)是非主题的,因为您需要非现场资源。有趣的是,由于回答者可以在其答案中复制该表,因此询问优先级表本身将成为一个主题,因此您可能需要编辑您的问题。
throw
确实是一个运算符。非常好的答案:)。但优先级与递归分析到底有什么不同呢?当我们人类分析一个表情时。说8*5+7*3。我们将其拆分,然后首先解析(读:计算)多重应用程序。那是递归的,对吗?