运算符的优先级和结合性是什么?

2024-02-02

C++ 中运算符的优先级和结合性是什么?

谁定义了运算符优先级和结合性,以及它与求值顺序有何关系? https://stackoverflow.com/q/20767745/5740428解释了这些属性如何从语法中出现。然而,我只是对所有规则的列表感兴趣。


This question is supposed to be a community FAQ which can be referenced instead of the cppreference article https://en.cppreference.com/w/cpp/language/operator_precedence.


C++ 运算符优先级

Operator/Expression Grammatical Rule Description Associativity
and Arity
0, id, this, []{},
(expression),
(x, ...),
requires () {}
primary-expression https://eel.is/c++draft/expr.prim#:primary-expression Literals, identifiers, fold expressions, requires expressions, etc. These don't really have precedence, but are the building block out of which other expressions are built. None
:: qualified-id https://eel.is/c++draft/expr.prim#nt:qualified-id Scope resolution https://en.cppreference.com/w/cpp/language/identifiers#Qualified_identifiers. :: is also not an operator strictly speaking, but a way of combining multiple identifiers into a single name. Left-to-right
Binary
x++ x--
type() type{}
x() x[]
., ->
static_cast
typeid, ...
postfix-expression https://eel.is/c++draft/expr.post.general#nt:postfix-expression Postfix expressions. Casts like static_cast are also classified as a postfix expression, although usually people don't consider it an operator and there is usually no confusion as to its precedence. Left-to-right
Various
++x, --x
+x -x
!x ~x
(type) x
*x &x
sizeof
co_await
new
delete
unary-expression https://eel.is/c++draft/expr.unary.general#nt:unary-expression Prefix expressions. This also includes C-style casts, co_await, new, and delete, which not everyone expects to be an operator.

Note that the operand to sizeof cannot be a C-style cast, e.g. sizeof (int)x is parsed as sizeof(int) followed by x.
Right-to-left
Various
.* ->* pm-expression https://eel.is/c++draft/expr.mptr.oper#nt:pm-expression Pointer-to-member operators. Left-to-right
Binary
* / % multiplicative-expression https://eel.is/c++draft/expr.mul#nt:multiplicative-expression Multiplicative operators.
+ - additive-expression https://eel.is/c++draft/expr.add#nt:additive-expression Additive operators.
<< >> shift-expression https://eel.is/c++draft/expr.shift#nt:shift-expression Bitwise shift operators.
<=> compare-expression https://eel.is/c++draft/expr.spaceship#nt:compare-expression Three-way comparison operator.
< >
<= >=
relational-expression https://eel.is/c++draft/expr.rel#nt:relational-expression Relational comparison operators. Note that a < b < c means (a < b) < c and is likely a mistake.
== != equality-expression https://eel.is/c++draft/expr.eq#nt:equality-expression Equality comparison operators. Note that a == b == c means (a == b) == c and is likely a mistake.
& and-expression https://eel.is/c++draft/expr.bit.and#nt:and-expression Bitwise AND operator.
^ exclusive-or-expression https://eel.is/c++draft/expr.xor#nt:exclusive-or-expression Bitwise XOR operator.
| inclusive-or-expression https://eel.is/c++draft/expr.or#nt:inclusive-or-expression Bitwise OR operator.
&& logical-and-expression https://eel.is/c++draft/expr.log.and#nt:logical-and-expression Logical AND operator.
|| logical-or-expression https://eel.is/c++draft/expr.log.or#nt:logical-or-expression Logical OR operator.
a?b:c conditional-expression https://eel.is/c++draft/expr.cond#nt:conditional-expression Conditional operator, colloquially called "ternary operator". Note that b is parsed as if it was parenthesized, so its precedence doesn't matter. Right-to-left
Ternary
= += ...
co_yield
throw
assignment-expression https://eel.is/c++draft/expr.ass#nt:assignment-expression Regular assignment and compound assignment. Also yield expression and throw expressions. Right-to-left
Various
, expression https://eel.is/c++draft/expr.comma#nt:expression Comma operator Left-to-right
Binary

请注意,此列表同样适用于 C 中的运算符优先级。 C++ 规则是 C 规则的超集,这意味着它们是相同的,只是具有更多运算符。

常见示例

Expression Parenthesized Explanation
x + y * z x + (y * z) * has higher precedence
x + y + z (x + y) + z + is left-associative
x = y = z x = (y = z) = is right-associative
x || y && z x || (y && z) && has higher precedence
(this makes disjunctive normal forms
easy to write)
x || y || z (x || y) || z || is left-associative
x = y ? a : b x = (y ? a : b) ?: has higher precedence,
and is right-associative
*x++ *(x++) postfix expressions have higher precedence
*++x *(++x) prefix expressions are right-associative
x | y << z x | (y << z) << has higher precedence
cout << x ? y : z (cout << x) ? y : z << has higher precedence
x << y + z x << (y + z) + has higher precedence

另请参阅其他网站

  • cppreference 上的 C++ 运算符优先级 https://en.cppreference.com/w/cpp/language/operator_precedence
  • C++ 附录 A.5 表达式,[gram.expr] https://eel.is/c++draft/gram.expr
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运算符的优先级和结合性是什么? 的相关文章

  • 静态只读字符串数组

    我在我的 Web 应用程序中使用静态只读字符串数组 基本上数组有错误代码 我将所有类似的错误代码保存在一个数组中并检查该数组 而不是检查不同常量字符串中的每个错误代码 like public static readonly string m
  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp

随机推荐

  • WPF 控件的公共类修饰符

    我正在创建 Windows 应用程序和类库 类库包含名为 InsertForm xaml 的 WPF 控件 InsertForm 包含名为 eUserName 的文本框 我使用以下代码来显示 InsertForm 这样就成功了 但我无法访问
  • 如何安装列出的类型?

    我正在使用带有 Typescript 的库 并收到编译器错误 public components chatlogs ts 25 19 错误 TS2304 找不到名称 Handsontable 似乎有一个打字 typings search h
  • 工厂方法设计模式

    据书中所述 工厂模式的本质是 定义一个接口 创建一个对象 但让子类决定使用哪个类 实例化 Factory 方法让类将实例化推迟到 子类 假设我有一个 Creator 类 class Product this is what the Fact
  • 使用 javascript 获取当前月份的天数

    对于我的网站 我试图获取特定功能当前月份的天数 我在网上看到过获取指定月份的天数的示例 但是我需要获取当前月份的天数并找出该月还剩多少天 这是我设法组合的代码 function myFunction var today new Date v
  • 生产/heroku 失败:WHERE a.attrelid = '"schools"'::regclass

    我在本地环境中添加了一个名为schools并且在开发中运行良好 事实上 它甚至在暂存 heroku 中工作得很好 但在生产中却失败了很多rake db migrate抛出以下错误 我什至无法预编译资产 使用 RAILS ENV 生产 访问我
  • 使用 git 或 gitLab 的持续集成来部署 Angular 应用程序

    我希望通过 Apache 服务器上的 bitbucket 持续集成来部署 Angular 5 应用程序 现在因为我是该领域的新手 所以我不知道执行此操作的可能选择 比如我们是否需要将 webpack 与 Jenkins 集成 或者我们是否需
  • Node.js 中的 JSON 对象是全局的吗?

    我似乎找不到 Node js 的 JSON parse 的文档 我只是看到它散落在各种脚本周围 我想知道 它从哪里来 是否有某些回调使其可用 或者它是一个全局对象 谢谢 马特 穆勒 它内置于 V8 中 这是他们的实现的链接 http cod
  • 数据网格复选框自动化

    我有一个带有复选框的数据网格 当我单击单元格时 我希望在选择包含该复选框的单元格时自动选中该复选框 它现在所做的是我需要选择单元格然后单击复选框 这对我们来说非常烦人
  • 如何在 Javascript 中使用 onPageLoad?

    我尝试使用 onPageLoad function alert hi 但这行不通 我需要它作为 Firefox 扩展 请问有什么建议吗 如果你想在普通 JavaScript 中执行此操作 只需使用window onload事件处理程序 wi
  • 如何制作 TortoiseSVN diff .dot 和 .dotx Word 模板文件

    TortoiseSVN 具有区分 Microsoft Word 文档修订版的惊人能力 这显然是通过以下脚本实现的 C Program Files TortoiseSVN Diff Scripts它调用 MS Word 进行比较 而不是使用
  • Rails 3 - 如何通过 order by 从模型中获取行号

    我正在制作一个小应用程序 其中包含排行榜概念 基本上 该模型只是一个player name 和一个current score 我想做的是获取特定玩家的排名 并且考虑到新的分数一直在出现 它需要是动态的 显然 我可以使用 order by 子
  • 如何使用 VBA 编辑电源查询的源?

    我正在尝试使用 VBA 编辑我的查询之一的源 这是我到目前为止所拥有的 Dim mFormula As String mFormula let Source Excel Workbook File Contents wbname null
  • 使用 d3 或 cytoscape 渲染家谱

    我在用 Javascript 生成漂亮的家谱时遇到问题 要求 每个孩子应该连接到树中的两个父母 而不是像某些图中的一个 我希望配偶在树上彼此相邻 相同的垂直位置 我想把节点按世代垂直组织起来 这样你就能一目了然地看到同一年代出生的人 随着时
  • 没有 (Show (Double -> Double)) 的实例

    我有以下代码 它使用牛顿法来近似某个数字的平方根 问题是当我运行它时 我收到错误 出了什么问题 我该如何解决 newtonRootSequence Double gt Double newtonRootSequence d newtonSe
  • Google 地图地理编码 API 速率限制不正确

    我正在向我公司使用的内部工具之一添加映射功能 长话短说 我们有大约 50 个需要放置在地图上的地址的列表 我使用 Google 地图 使其成为交互式地图 然后使用 javascript API 进行地理编码和添加标记 根据谷歌的文档 htt
  • 包含 对于带有 hashbang 的页面有害吗?

    谷歌关于这个元标签的说法是 以下重要限制适用 元标记只能出现在没有哈希片段的页面中 仅有的 可能会出现在内容字段中 元标记必须出现在文档的头部 Source https developers google com webmasters aj
  • 将字符串转换为列表。 Python [string.split() 表现得很奇怪]

    temp a b c print type temp string output a b c print type output list 所以我有这个临时字符串 它基本上是字符串格式的列表 我正在尝试将其转回列表 但我不确定有什么简单的方
  • DRF SerializerMethodField如何传递参数

    有没有办法将参数传递给 Django Rest Framework SerializerMethodField 假设我有模型 class Owner models Model name models CharField max length
  • 如何指定样式表在文档中出现的顺序?

    我有几个样式组件 使用withStylesHOC 来导出它们 但我无法覆盖某些规则 因为 jss 将 mui 样式表的顺序与我的组件的样式表混合在一起 如何才能将自己的风格坚持到底 我和我的团队也偶然发现了这个问题 并设法找到了解决方案 显
  • 运算符的优先级和结合性是什么?

    C 中运算符的优先级和结合性是什么 谁定义了运算符优先级和结合性 以及它与求值顺序有何关系 https stackoverflow com q 20767745 5740428解释了这些属性如何从语法中出现 然而 我只是对所有规则的列表感兴