快速搜索 C++ 优先级会产生许多尝试。令人不安的是它们都是不同的。大多数肯定是错误的,尽管只是一些小细节。
我将包括三个。第一个来自 cppreference.com,声称有 16 个优先级。 Learn.cpp 有 18 个。 普渡大学的一个更简单的表格要简单得多。
http://en.cppreference.com/w/cpp/language/operator_precedence
http://www.learncpp.com/cpp-tutorial/31-precedence-and-associativity/
http://web.ics.purdue.edu/~cs240/misc/operators.html
这些都不是确定的,但当我查看 ISO 标准草案时,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf它甚至没有一个表格,说明你可以从上下文中找出它。
我的问题是 1) 是否有一个好的、明确的优先级总结?
2)任何人都可以对这些表格传达的所有不同“事实”发表评论吗?
例如,前两个同意后递增/递减与括号处于同一级别,这在实践中意味着什么?
(x+1)++
没有任何意义,因为 x+1 是一个 reexpr,并且显然括号表达式使后增量无效。
(*p)++;
我读到后增量高于前增量,所以我会把它放在 () [] 等下面。是什么使它相等(如果是)?
cppreference 声称 throw 与赋值运算符处于同一级别。这似乎显然是错误的,因为:
throw x += 5;
在抛出之前应该首先计算 x += 5。 learncpp 有所不同,第三个来源根本没有提到 throw 作为运算符。
这是我第一次见到运算符(operator)。我承认多年来没有研究标准,但 return 是一个声明,为什么不抛出呢?
任何能够阐明优先级表部分的评论都会很棒。
最佳答案
优先级不是语言规范的一部分。它是我们人类使用的助记工具,用于理解表达式的含义,而无需像实际解析器一样递归分析它。
throw、?: 以及 C++ 中的所有赋值都是语法产生式中的替代赋值表达式,定义如下
assignment-expression:
conditional-expression
logical-or-expression assignment-operator initializer-clause
throw-expression
其中条件表达式定义为逻辑或表达式 ? 表达式 : 赋值表达式,初始化子句是另一个赋值表达式(当它不是花括号初始化时) list),并且 throw-expression 被定义为关键字 throw
后跟可选的 assignment-expression
.
用人类的术语来说,我们将其描述为“相同的优先级,从右到左分组”。
重复使用cppreference示例,
e = a < d ? a++ : a = d
解析为 e = ((a < d) ? (a++) : (a = d))
和false ? 7 : throw 3
解析为 false ? 7 : (throw 3)
,是的,你的例子 throw x += 5
解析为 throw (x += 5)
关于C++ 优先级明确列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30276755/