当前位置: 首页 > 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.dtcms.com/a/334364.html

相关文章:

  • 2508C++,支持rdma通信的高性能rpc库
  • 软件SPI实现(3):SPI协议测试(使用W25Q64)
  • Jenkins常见问题及解决方法
  • 计算机存储器分类和层次结构详解
  • 027 动静态库 —— 静态库
  • Docker数据卷挂载和本地目录挂载
  • 八、SpringBoot项目热部署
  • Java服务自动停止原因及查找方法
  • Cloudflare Tunnels 部署与隧道异常关闭的解决方案
  • 攻击者如何毒害人工智能工具和防御系统
  • 【更新公告】C++算法·线段树
  • CF每日3题(1500-1700)
  • 《WINDOWS 环境下32位汇编语言程序设计》第2章 准备编程环境
  • IO流-序列化流
  • 记录 GMS 认证相关条件
  • 玄机靶场 | 日志分析-Tomcat日志分析
  • AI生成视频开源模型技术解析
  • Rocky Linux 9.2:从 /home 分区释放 10G 空间扩容到 / 根分区
  • AI可行性分析:数据×算法×反馈=成功
  • 【P40 6-3】OpenCV Python——图像融合(两张相同属性的图片按比例叠加),addWeighted()
  • 软考 系统架构设计师系列知识点之杂项集萃(124)
  • 池式结构之连接池
  • pwn定时器,ARM定时delay 外部中断用函数指针(统一)day55,56
  • 数据结构:满二叉树 (Full Binary Tree) 和 完全二叉树 (Complete Binary Tree)
  • 安卓定制开机动画的bootanimation.zip的注意点
  • (论文阅读)FedViT:边缘视觉转换器的联邦持续学习
  • 美国服务器环境下Windows容器工作负载基于指标的自动扩缩
  • Java驾驭金融风暴:大数据+机器学习重塑资产配置与风险平衡
  • CPP多线程3:async和future、promise
  • 【八股】计网-计算机网络-秋招