【发布时间】:2015-05-16 14:17:33
【问题描述】:
快速搜索 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 作为运算符。
这是我作为运营商第一次见到。我承认多年不研究标准,但return是一个声明,为什么不扔?
任何能够照亮优先表位的 cmets 在这里都会很棒。
【问题讨论】:
-
“这显然是错误的,因为:
throw x += 5;应该先计算 x += 5,然后再抛出。”它们具有相同的优先级并没有错。它们具有从右到左的关联性。如果要添加虚括号,则解析为throw (x += 5);。 -
在C++中,运算符优先级实际上是根据语法定义的。您引用的引用在不同的地方有
?:,但是像x ? y : z = 5这样的操作将被解析为(x) ? (y) : (z = 5),不是因为优先级而是因为conditional-expression 可以是logical-或表达式?表达式:赋值表达式. -
我 certainly disagree 和 learncpp 把
?:上面的作业。标准(或至少 N3936)表示它也从右到左分组,而不是从左到右。 -
@chris
b=5在您的第一个示例中是?:的一部分,请在您之前查看我的评论。 -
请注意,您的第一个问题(是否有一个好的、明确的优先级总结)是题外话,因为您要求的是场外资源。有趣的是,询问优先级表本身将成为话题,因为回答者可以在其答案中重现该表,因此您可能需要编辑您的问题。
标签: c++ operators language-lawyer operator-precedence