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

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(使用前将#替换为@)

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

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 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解释了这些属性如何从语法中出现 然而 我只是对所有规则的列表感兴