C++ 表达式求值的基础(四十九)

1. 运算符的分类

1.1 按操作数个数

  • 一元运算符(Unary)
    作用于单个操作数:

    • 取地址 &obj
    • 解引用 *ptr
    • 逻辑非 !b
    • 一元加减 +x, -x
    • 递增递减 ++i, i--
  • 二元运算符(Binary)
    作用于两个操作数:

    • 算术运算 a + b, a * b
    • 关系判断 a == b, a < b
    • 逻辑运算 a && b, a || b
    • 下标 arr[i](相当于 *(arr + i)
  • 三元运算符(Ternary)
    唯一示例:条件运算符

    int x = cond ? v1 : v2;
    
  • 函数调用
    虽非传统符号,但 f(a,b,…) 本质上对任意数量操作数执行运算。

某些符号(如 *+-&)既可作一元运算符也可作二元运算符,含义由上下文决定。

2. 表达式组合:优先级与结合律

  • 优先级(Precedence)
    决定无括号时运算符的组合:

    5 + 10 * 20 / 2   // 等同于 5 + ((10 * 20) / 2)
    
  • 结合律(Associativity)
    指同级运算符的结合方向:

    • 大多数算术、关系、逻辑运算符为 左结合a - b - c(a - b) - c
    • 赋值、条件运算符为 右结合
  • 求值顺序(Order of Evaluation)
    C++17 以后,函数参数、子表达式在大多数场合都有确定顺序;之前则可能未指定,需谨慎避免副作用冲突。

3. 操作数的类型转换

表达式中不同类型操作数经常需要统一类型:

  1. 算术提升(Promotion)
    小于 int 类型(charshortbool)提升为 intunsigned int

  2. 算术转换(Conversion)
    如果两操作数类型仍不一致,向“更高精度”或“更大容量”类型转换:

    int + doubledouble
    
  3. 指针与其他类型
    默认不允许指针与整型或浮点混用,除非显式地 reinterpret_cast

  4. 用户定义转换
    类可通过定义 operator T()explicit operator T() 实现自定义类型转换。

4. 重载运算符

C++ 支持为自定义类型重载运算符,赋予它们类特有的行为:

struct Vec {double x,y;Vec operator+(Vec const& rhs) const {return { x + rhs.x, y + rhs.y };}
};

重载不会改变运算符原有的优先级或结合律,只影响操作数类型和返回类型。

5. 左值(lvalue)与右值(rvalue)

  • 左值
    表示内存中可寻址的对象或函数,可以(通常)出现在赋值的左侧。

  • 右值
    表示临时性值或常量,不可取地址,不能做左侧操作数。

运算操作数要求返回值性质
=需非常量左值左值
&左值右值(指针)
*p指针左值
arr[i]可退化为指针的数组左值
++i左值左值
i++左值右值(旧值)

在“需要右值”的场合(如按值传参),可用左值;但在“需要左值”的场合,绝不可用右值。

结语

理解以上基础,能帮助你:

  • 正确书写复杂表达式
  • 避免隐式求值顺序和类型转换带来的隐患
  • 充分利用 C++ 的运算符重载,提升代码可读性

希望这篇博客能助你在日常编程中游刃有余地驾驭 C++ 表达式,写出更健壮、高效的代码。欢迎在评论区交流更多心得!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Three.js + React 实战系列 : 从零搭建 3D 个人主页

可能你对tailiwindcss毫不了解&#xff0c;别紧张&#xff0c;记住我们只是在学习&#xff0c;学习的是作者的思想和技巧&#xff0c;并不是某一行代码。 在之前的几篇文章中&#xff0c;我们已经熟悉了 Three.js 的基本用法&#xff0c;并通过 react-three-fiber 快速构建了一…

Kotlin实现Android应用保活方案

Kotlin实现Android应用保活优化方案 以下的Android应用保活实现方案&#xff0c;更加符合现代Android开发规范&#xff0c;同时平衡系统限制和用户体验。 1. 前台服务方案 class OptimizedForegroundService : Service() {private val notificationId 1private val channel…

windows拷贝文件脚本

1、新建脚本文件xxx.bat&#xff0c;名字任意&#xff0c;后缀未.bat即可&#xff0c;将以下内容拷贝进去&#xff0c;修改src和des为自己文件的目录即可。 echo off :: 设置字符集为UTF-8&#xff0c;命令窗口能正确显示中文字符。 chcp 65001 rem 读取当前目录并进入当前目…

Qt 核心库总结

Qt 核心库&#xff08;QtCore&#xff09; QtCore 是 Qt 框架的基础模块&#xff0c;提供非图形界面的核心功能&#xff0c;是所有 Qt 应用程序的基石。它包含事件循环、信号与槽、线程管理、文件操作、字符串处理等功能&#xff0c;适用于 GUI 和非 GUI 应用程序。本文将从入…

大模型相关面试问题原理及举例

大模型相关面试问题原理及举例 目录 大模型相关面试问题原理及举例Transformer相关面试问题原理及举例大模型模型结构相关面试问题原理及举例注意力机制相关面试问题原理及举例大模型与传统模型区别 原理:大模型靠海量参数和复杂结构,能学习更复杂模式。传统模型参数少、结构…

【AI+HR实战应用】用DeepSeek提升HR工作效能

用DeepSeek提升HR工作效能 一、AI 与 AIGC 简介二、DeepSeek 介绍三、使用 DeepSeek 的渠道及硬件要求四、使用 DeepSeek 的核心技巧五、AI 在人力资源的应用场景六、AI 绘画与多模态应用七、个人使用 AI 的能力层级八、企业拥抱 AI 的策略九、提示词管理的重要性 一、AI 与 AI…

Postgresql几个常用的json操作

将行记录转为jsonb row_to_json(表名或别名)将行记录集转为json数组 &#xff08;jsonb) select json_agg(row_to_json(t) order by t.task_name) into v_next_taskfrom dyna_flow_task t where t.zidv_template_id and t.levelv_next_level ;访问json字段&#xff0c;用->…

ESP32学习与快速总结——5.系统存储

1.ESP32分区表 为什么ESP32要分区 00&#xff1a;34-- 简述&#xff1a;其他单片机生成文件少&#xff0c;功能少&#xff0c;而ESP32功能多&#xff0c;文件多 分区表各个文件简介 --7&#xff1a;31vscode查看分区表 --9&#xff1a;33ota通过idf.py menuconfi…

Linux 进程控制(自用)

非阻塞调用waitpid 这样父进程就不会阻塞&#xff0c;此时循环使用我们可以让父进程执行其他任务而不是阻塞等待 进程程序替换 进程PCB加载到内存中的代码和数据 替换就是完全替换当前进程的代码段、数据段、堆和栈&#xff0c;保存当前的PCB 代码指的是二进制代码不是源码&a…

Spring 微服务解决了单体架构的哪些痛点?

1. 部署困难 (Deployment Difficulty & Risk) 单体痛点: 整体部署: 对单体应用的任何微小修改&#xff08;哪怕只是一行代码&#xff09;&#xff0c;都需要重新构建、测试和部署整个庞大的应用程序。部署频率低: 由于部署过程复杂且风险高&#xff0c;发布周期通常很长&a…

面试题之高频面试题

最近开始面试了&#xff0c;410面试了一家公司 针对自己薄弱的面试题库&#xff0c;深入了解下&#xff0c;也应付下面试。在这里先祝愿大家在现有公司好好沉淀&#xff0c;定位好自己的目标&#xff0c;在自己的领域上发光发热&#xff0c;在自己想要的领域上&#xff08;技术…

【MySQL】Read view存储的机制,记录可见分析

read view核心组成 1.1 事务id相关 creator_trx_id: 创建该read view的事务id 每开启一个事务都会生成一个 ReadView&#xff0c;而 creator_trx_id 就是这个开启的事务的 id。 m_ids: 创建read view时系统的活跃事务&#xff08;未提交的事务&#xff09;id集合 当前有哪些事…

【刷题Day20】TCP和UDP(浅)

TCP 和 UDP 有什么区别&#xff1f; TCP提供了可靠、面向连接的传输&#xff0c;适用于需要数据完整性和顺序的场景。 UDP提供了更轻量、面向报文的传输&#xff0c;适用于实时性要求高的场景。 特性TCPUDP连接方式面向连接无连接可靠性提供可靠性&#xff0c;保证数据按顺序…

Flink 内部通信底层原理

Flink 集群内部节点之间的通信是用 Akka 实现,比如 JobManager 和 TaskManager 之间的通信。而 operator 之间的数据传输是用 Netty 实现。 RPC 框架是 Flink 任务运行的基础,Flink 整个 RPC 框架基于 Akka 实现。 一、相关概念 RPC(Remote Procedure Call) 概念 定义:…

企业级Kubernetes 1.28高可用集群离线部署全指南(含全组件配置)

企业级Kubernetes 1.28高可用集群离线部署全指南(含全组件配置) 摘要:本文手把手教学在无外网环境下部署生产级Kubernetes 1.28高可用集群,涵盖ETCD集群、HAProxy+Keepalived负载均衡、Containerd运行时、Calico网络插件及Kuboard可视化管理全流程。提供100年有效证书配置…

【中间件】redis使用

一、redis介绍 redis是一种NoSQL类型的数据库&#xff0c;其数据存储在内存中&#xff0c;因此其数据查询效率很高&#xff0c;很快。常被用作数据缓存&#xff0c;分布式锁 等。SpringBoot集成了Redis&#xff0c;可查看开发文档Redis开发文档。Redis有自己的可视化工具Redis …

C语言——函数递归与迭代

各位CSDN的uu们大家好呀&#xff0c;今天将会给大家带来关于C语言的函数递归的知识&#xff0c;这一块知识理解起来稍微会比较难&#xff0c;需要多花点时间。 话不多说&#xff0c;让我们开始今天的内容吧&#xff01; 目录 1.函数递归 1.1 什么是递归&#xff1f; 1.2 递归…

藏品馆管理系统

藏品馆管理系统 项目简介 这是一个基于 PHP 开发的藏品馆管理系统&#xff0c;实现了藏品管理、用户管理等功能。 藏品馆管理系统 系统架构 开发语言&#xff1a;PHP数据库&#xff1a;MySQL前端框架&#xff1a;BootstrapJavaScript 库&#xff1a;jQuery 目录结构 book/…

centos停服 迁移centos7.3系统到新搭建的openEuler

背景 最近在做的事&#xff0c;简单来讲&#xff0c;就是一套系统差不多有10多台虚拟机&#xff0c;都是centos系统&#xff0c;版本主要是7.3、7.6、7.9&#xff0c;现在centos停止维护了&#xff0c;转为了centos stream&#xff0c;而centos stream的定位是&#xff1a;Red …

什么是 IDE?集成开发环境的功能与优势

原文&#xff1a;什么是 IDE&#xff1f;集成开发环境的功能与优势 | w3cschool笔记 &#xff08;注意&#xff1a;此为科普文章&#xff0c;请勿标记为付费文章&#xff01;且此文章并非我原创&#xff0c;不要标记为付费&#xff01;&#xff09; IDE 是什么&#xff1f; …