C++ 优先级明确列表

标签 c++ operators language-lawyer operator-precedence

快速搜索 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/

相关文章:

c++ - 内联类方法的寄存器优化不足

c++ - 将代码分成 block 是好的做法吗?

c++ - C++ 中 cin.fail() 的含义?

java - 如何在Java中基于节点枚举对象?

prolog - 自定义 Prolog 算术函数

c++ - 将其他库与静态库一起使用?

c - 运算符 `<--` 在 C 中做什么?

c++ - 无法使用自动参数化 true_type 检测 T::value()

c - 空指针是否间接指向数组类型 UB?

c++ - 从理论上讲,仅在动态分配中使用内存范围的意外重用来同步线程是否(错误地)合法?