当前位置: 首页 > news >正文

CPP运算符优先级

今天跳进了一个坑

double result = 1. + true ? 0.5 : 1.;// 输出 0.5
  1. 根据 运算符优先级,

    算术加法 + 的优先级 高于 条件运算符 ?:

    所以先算 1. + true

  2. true 会 整型提升 为 1

    于是得到 1. + 12.0(double)。

  3. 剩下的表达式变成

    2.0 ? 0.5 : 1.

  4. C++ 中 任何非 0 的值在布尔上下文中都视为 true,

    因此条件为真,选择 0.5

  5. 最终 result = 0.5


一句话总结
优先级:+ > ?:,因此原式先算 1. + true,结果为 0.5。




在 C++ 中,运算符的优先级(precedence)和结合性(associativity)决定了表达式在没有括号时的解析顺序。

下面给出 C++20 标准中常用的全部运算符,按照优先级从高到低排列(同一行优先级相同),并注明结合性。记住最常用的一句口诀:“单算关逻条赋逗”(单目 > 算术 > 关系 > 逻辑 > 条件 > 赋值 > 逗号),就能应付 90% 的场景。


  1. 作用域与字面量
运算符含义结合性
::全局 / 命名空间作用域左→右
a::b类 / 命名空间成员左→右

  1. 后缀/前缀
运算符含义结合性
a++ a--后缀自增 / 自减左→右
type() type{}函数风格强制类型转换左→右
a()函数调用左→右
a[b]下标左→右
a.b a->b成员访问左→右

  1. 一元(单目)
运算符含义结合性
++a --a前缀自增 / 自减右→左
+a -a正 / 负号右→左
! ~逻辑非 / 按位取反右→左
(type)aC 风格强制类型转换右→左
* &解引用 / 取地址右→左
sizeof alignof长度 / 对齐右→左
co_awaitC++20 协程等待右→左
new delete动态内存右→左

  1. 成员指针
运算符含义结合性
.* ->*成员指针访问左→右


  1. 乘除模
运算符含义结合性
* / %乘 / 除 / 取模左→右

  1. 加减
运算符含义结合性
+ -加 / 减左→右

  1. 位移
运算符含义结合性
+ -加 / 减左→右


  1. 关系比较
运算符含义结合性
< <= > >=小于 / 小于等于 / 大于 / 大于等于左→右

  1. 相等比较
运算符含义结合性
== !=等于 / 不等于左→右

  1. 按位与
运算符含义结合性
&按位与左→右

  1. 按位异或
运算符含义结合性
^按位异或左→右

  1. 按位或
运算符含义结合性
``按位或左→右

  1. 逻辑与
运算符含义结合性
&&逻辑与左→右

  1. 逻辑或
运算符含义结合性
``逻辑或左→右

  1. 三目条件
运算符含义结合性
a ? b : c条件运算符右→左

  1. 赋值与复合赋值
运算符含义结合性
= += -= *= /= %= &= `=^=<<=>>=`赋值与复合赋值右→左

  1. 逗号
运算符含义结合性
,逗号(顺序求值)左→右

速查口诀(从低到高记忆)

“单算关逻条赋逗”

单目 → 算术 → 关系 → 逻辑 → 条件 → 赋值 → 逗号


常见易错点

  1. * 既可以是乘号(优先级 5)也可以是解引用(优先级 3),取决于上下文。
  2. << 既可以是位移(优先级 7)也可以是流插入(重载为函数调用,实际表现为左→右)。
  3. && 的优先级低于 ||,因此
   if (a || b && c)   // 等价于 if (a || (b && c))
  1. 条件运算符 ?: 的结合性是 右→左,因此
   a ? b : c ? d : e   // 等价于 a ? b : (c ? d : e)

实战示例

int x = 2, y = 3, z = 4;
int result = x + y * z;   // 14, 因为 * 高于 +
result = x * y + z;       // 10
result = x & y + z;       // 2 & (3 + 4) = 2 & 7 = 2
result = x == y && z;     // (x == y) && z → false
result = x < y ? x : y;   // 2

官方参考
如需最权威、完整的列表,可直接查阅标准草案 N4860 §7.6.19(2020 草案)的表 15。

http://www.lryc.cn/news/623090.html

相关文章:

  • [go] 桥接模式
  • RecSys:多目标模型和MMOE
  • pwn定时器,ARM定时delay 外部中断用函数指针(统一)day55,56
  • 一周学会Matplotlib3 Python 数据可视化-绘制自相关图
  • mysql使用group by的时候想显示没有参与聚合的字段怎么办
  • 软考 系统架构设计师系列知识点之杂项集萃(125)
  • 【JavaEE】(13) Spring Web MVC 入门
  • 深度解码格行无缝切网引擎:40%延迟降低背后的多网智能切换架构
  • [ai-agent]环境简介之沙盒e2b vs daytona
  • 海康机器人3D相机的应用
  • qsort实现数据排序
  • 零知开源——基于STM32F407VET6的TCS230颜色识别器设计与实现
  • 启发式合并 + 莫队 恋恋的心跳大冒险
  • 【机器学习深度学习】OpenCompass:支持的开源评估数据集及使用差异
  • 告别重复纹理:用Substance Designer构建UE5程序化地貌材质系统
  • SysTick寄存器(嘀嗒定时器实现延时)
  • EP1C12F324I7N Altera Cyclone FPGA
  • [创业之路-550]:公司半年度经营分析会 - 解决方案汇总
  • Vue2.x核心技术与实战(一)
  • Java 学习笔记(基础篇3)
  • 嵌入式硬件篇---电源电路
  • php版的FormCreate使用注意事项
  • 从频繁告警到平稳发布:服务冷启动 CPU 风暴优化实践00
  • Flow-GRPO:通过在线 RL 训练 Flow matching 模型
  • 【OpenGL】LearnOpenGL学习笔记10 - 平行光、点光源、聚光灯
  • 2020/12 JLPT听力原文 问题二 2番
  • CSDN部分内容改为视频转到B站-清单
  • Flink Stream API 源码走读 - print()
  • B3865 [GESP202309 二级] 小杨的 X 字矩阵(举一反三)
  • 矩阵链相乘的最少乘法次数(动态规划解法)