「C++系列」一篇文章讲透【运算符】

文章目录

  • 一、运算符
    • 1. 算术运算符
    • 2. 关系运算符
    • 3. 逻辑运算符
    • 4. 位运算符
    • 5. 赋值运算符
    • 6. 条件运算符(三元运算符)
    • 7. 成员访问运算符
    • 8. 指针和地址运算符
    • 9. 类型转换运算符
    • 10. 其他运算符
  • 二、其他特殊运算符
    • 1. 成员访问运算符
    • 2. 指针和地址运算符
    • 3. 类型转换运算符
    • 4. 作用域解析运算符
    • 5. 其他特殊运算符
    • 6. 复合赋值运算符
    • 7. 自增和自减运算符
    • 8. 逗号运算符
  • 三、运算符优先级
    • 1.运算符优先级(从高到低)
    • 2. 运算符结合性
    • 3. 注意事项
  • 四、相关链接

在这里插入图片描述

一、运算符

C++ 支持多种运算符,这些运算符用于执行算术运算、关系测试、逻辑运算、位运算、赋值以及特殊操作(如成员访问、指针解引用等)。下面是一些主要的C++运算符分类及其示例:

1. 算术运算符

  • + 加法
  • - 减法
  • * 乘法
  • / 除法
  • % 求余(模运算)
  • ++ 自增
  • -- 自减
int a = 5, b = 2;
int sum = a + b; // 结果为 7
int product = a * b; // 结果为 10
int remainder = a % b; // 结果为 1

2. 关系运算符

  • == 等于
  • != 不等于
  • > 大于
  • < 小于
  • >= 大于等于
  • <= 小于等于
bool result = (a > b); // 结果为 true

3. 逻辑运算符

  • && 逻辑与
  • || 逻辑或
  • ! 逻辑非
bool isPositive = (a > 0); // 结果为 true
bool isBothPositive = (a > 0) && (b > 0); // 结果为 false

4. 位运算符

  • & 按位与
  • | 按位或
  • ^ 按位异或
  • ~ 按位取反
  • << 左移
  • >> 右移
int a = 5; // 二进制为 101
int b = 3; // 二进制为 011
int andResult = a & b; // 结果为 1,二进制 001

5. 赋值运算符

  • = 赋值
  • += 加后赋值
  • -= 减后赋值
  • *= 乘后赋值
  • /= 除后赋值
  • %= 求余后赋值
a += 2; // 等同于 a = a + 2

6. 条件运算符(三元运算符)

  • ? :
int max = (a > b) ? a : b; // 如果a大于b,则max为a,否则为b

7. 成员访问运算符

  • . 成员访问
  • -> 指针成员访问
struct Point {int x, y;
};
Point p = {1, 2};
int x = p.x; // 访问成员xPoint* ptr = &p;
int y = ptr->y; // 通过指针访问成员y

8. 指针和地址运算符

  • & 取地址
  • * 解引用指针
int var = 20;
int* ptr = &var; // ptr存储了var的地址
int val = *ptr; // 通过ptr访问var的值

9. 类型转换运算符

  • static_cast<type>(expr)
  • dynamic_cast<type>(expr)
  • reinterpret_cast<type>(expr)
  • const_cast<type>(expr)
double d = 3.14;
int i = static_cast<int>(d); // 将double转换为int

10. 其他运算符

  • sizeof 运算符(用于计算类型或变量的大小)
  • newdelete 运算符(用于动态内存分配和释放)
  • new[]delete[] 运算符(用于动态分配和释放数组)
int* p = new int; // 分配一个int类型的内存
delete p; // 释放内存int* arr = new int[10]; // 分配一个包含10个int的数组
delete[] arr; // 释放数组内存

二、其他特殊运算符

C++中的运算符非常丰富,除了常见的算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符外,还包括其他一些重要的运算符。

1. 成员访问运算符

  • .(点运算符):用于访问对象的成员(变量或方法)。
  • ->(箭头运算符):用于通过指针访问对象的成员。

2. 指针和地址运算符

  • &(取地址运算符):用于获取变量的地址。
  • *(解引用运算符):用于访问指针所指向的值。

3. 类型转换运算符

  • static_cast<type>(expr):用于基本数据类型之间的转换,以及有继承关系的类之间的转换。
  • dynamic_cast<type>(expr):主要用于有继承关系的类之间的安全转换,并用于处理类的层次结构中的向下转换。
  • reinterpret_cast<type>(expr):用于进行各种不同类型的指针之间的转换,以及指针和足够大的整数类型之间的转换。
  • const_cast<type>(expr):用于修改类型的const或volatile属性。

4. 作用域解析运算符

  • ::(作用域解析运算符):用于指定类或命名空间的作用域,以访问其成员。

5. 其他特殊运算符

  • sizeof:用于获取类型或变量的大小(以字节为单位)。
  • newdelete:用于动态内存分配和释放。new[]delete[] 分别用于动态分配和释放数组。
  • throw:用于抛出异常。
  • catch:与trythrow一起使用,用于捕获并处理异常。注意,catch本身不是单独的运算符,但它是C++异常处理机制中的关键部分。
  • ? :(条件运算符):也称为三元运算符,用于根据条件选择两个值中的一个。

6. 复合赋值运算符

虽然这些在前面的回答中已经提及,但它们是赋值运算符的扩展,包括+=-=*=/=%=&=|=^=<<=>>=等,它们将算术或位运算的结果直接赋值给左侧的变量。

7. 自增和自减运算符

  • ++(自增运算符):用于将变量的值增加1。
  • --(自减运算符):用于将变量的值减少1。

这两种运算符都可以作为前缀(如++a)或后缀(如a++)使用,但它们在表达式中的行为略有不同(前缀版本在表达式求值之前改变变量的值,而后缀版本在表达式求值之后改变变量的值)。

8. 逗号运算符

  • ,(逗号运算符):用于分隔函数参数表中的各参数,或在表达式中分隔多个子表达式,但整个逗号表达式的值是其最右侧子表达式的值。

三、运算符优先级

类别运算符结合性
后缀() [] -> . ++ - -从左到右
一元+ - ! ~ ++ - - (type)* & sizeof从右到左
乘除* / %从左到右
加减+ -从左到右
移位<< >>从左到右
关系< <= > >=从左到右
相等== !=从左到右
位与 AND&从左到右
位异或 XOR^从左到右
位或 OR竖杠从左到右
逻辑与 AND&&从左到右
逻辑或 OR双竖杠从左到右
条件?: 从右到左
赋值= += -= *= /= %=>>= <<= &= ^== 从右到左
逗号,从左到右

1.运算符优先级(从高到低)

  1. 范围解析运算符 ::
  • 用于访问类的静态成员或全局变量,当与类名或命名空间名一起使用时。
  1. 成员访问和数组下标运算符
  • .(成员访问)
  • ->(指针成员访问)
  • [](数组下标)
  • ()(函数调用或类型转换)
  1. 后缀和前缀自增/自减运算符
  • ++(后缀和前缀)
  • --(后缀和前缀)
  • 注意:前缀版本(如++a)的优先级高于后缀版本(如a++)。
  1. 一元运算符
  • +(正号)
  • -(负号)
  • !(逻辑非)
  • ~(按位取反)
  • &(取地址)
  • *(解引用指针)
  • sizeof(计算类型或变量大小)
  • newdelete(动态内存分配和释放)
  • 强制类型转换运算符(如(int)x
  1. 乘法、除法和取余运算符
  • *(乘法)
  • /(除法)
  • %(取余)
  1. 加法和减法运算符
  • +(加法)
  • -(减法)
  1. 位移运算符
  • <<(左移)
  • >>(右移)
  1. 关系运算符
  • <(小于)
  • <=(小于或等于)
  • >(大于)
  • >=(大于或等于)
  1. 相等和不等于运算符
  • ==(等于)
  • !=(不等于)
  1. 按位与运算符
  • &(按位与)
  1. 按位异或运算符
  • ^(按位异或)
  1. 按位或运算符
  • |(按位或)
  1. 逻辑与运算符
  • &&(逻辑与)
  1. 逻辑或运算符
  • ||(逻辑或)
  1. 条件运算符
  • ? :(三目运算符)
  1. 赋值运算符
  • =(简单赋值)
  • +=-=*=/=%=&=^=|=<<=>>=(复合赋值)
  1. 抛出异常运算符
  • throw
  1. 逗号运算符
  • ,(逗号运算符用于分隔函数参数或表达式中的多个子表达式)

2. 运算符结合性

  • 左结合性:大多数运算符都是左结合性的,即从左到右进行运算。例如,算术运算符(如+-*/)和关系运算符(如<<=>>=)等。
  • 右结合性:少数运算符是右结合性的,即从右到左进行运算。最典型的是赋值运算符(如=+=-=等)和条件运算符(? :)。

3. 注意事项

  • 当表达式中的运算符优先级相同时,运算顺序由运算符的结合性决定。
  • 如果不确定运算符的优先级或结合性,可以使用括号()来明确指定运算顺序,以提高代码的可读性和准确性。
    在这里插入图片描述

四、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C++系列」C++简介、应用领域
  4. 「C++系列」C++ 基本语法
  5. 「C++系列」C++ 数据类型
  6. 「C++系列」C++ 变量类型
  7. 「C++系列」C++ 变量作用域
  8. 「C++系列」C++ 常量知识点-细致讲解
  9. 「C++系列」C++ 修饰符类型
  10. 「C++系列」一篇文章说透【存储类】

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

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

相关文章

Laravel入门:快速启动你的第一个应用

当然&#xff01;下面是关于如何使用Laravel快速启动你的第一个应用的教程。 Laravel入门&#xff1a;快速启动你的第一个应用 1. 简介 Laravel是一个现代化的PHP框架&#xff0c;以其优雅的语法和丰富的功能广受欢迎。本教程将引导你从零开始创建一个简单的Laravel应用。 2…

python的自省机制(改bug有用)

在 Python 中&#xff0c;自省&#xff08;Introspection&#xff09;机制是指程序在运行时能够获取自身的信息&#xff0c;例如对象的类型、属性、方法等。 Python 提供了一些内置函数和特殊属性来支持自省。以下是一些常见的例子&#xff1a; type() 函数&#xff1a;返回对象…

Prometheus 云原生 - 监控 Linux、MySQL、Redis、RabbitMQ、Docker、SpringBoot 3.x

目录 开始 Exporter 采集数据&#xff0c;Prometheus 拉取并监控 Linux MySQL Redis RabbitMQ Docker SpringBoot 3.x 开始 Exporter 采集数据&#xff0c;Prometheus 拉取并监控 Note&#xff1a;Prometheus 和 Grafana 的部署已经在前面的章节中讲过了&#xff0c;不…

Solana Blink和SEND的崛起:技术与市场效应的结合

随着Solana生态系统的不断发展&#xff0c;新的项目和技术不断涌现&#xff0c;吸引了大量的关注和投资。最近&#xff0c;Solana的Blink项目及其相关的SEND代币成为了市场的焦点&#xff0c;引发了广泛的讨论和投资热潮。本文将探讨Blink和SEND的技术创新、市场表现以及未来的…

C++中的自定义数据类型:类和结构体

目录 自定义数据类型(1)类A.面向对象的四大特征B.What&#xff08;什么是类&#xff09;C.Why&#xff08;类的作用&#xff09;D.How&#xff08;如何定义和使用类&#xff09; (2)结构体 自定义数据类型 (1)类 A.面向对象的四大特征 谈到类&#xff0c;就必须讲一下面向对…

基于MATHCAD的傅里叶级数模拟和方波图像绘制

一、MATHCAD软件简介 MATHCAD是一款功能强大的数学计算软件&#xff0c;它允许用户以类似手写公式的方式输入数学表达式&#xff0c;并即时显示计算结果和图形。在工程研究和学术写作的世界里&#xff0c;MathCAD以其强大的符号运算能力和直观的数学书写体验脱颖而出。MATHCAD…

三相PWM整流器PI双闭环控制Simulink

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Rb&#xff09;软件。建议采用matlab2017 Rb及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09; 2.拓扑结构&#xff1a; 3.模型算法架构&#xff1a; 4.仿真算法&#xff1a; &am…

Lua协程(同步的多线程)

1.coroutine.create( func ) 创建一个协程&#xff0c;返回co&#xff08;coroutine&#xff09;&#xff0c;参数是一个函数&#xff0c;当调用resume时就唤醒co并调用函数 2.coroutine.resume(co, 函数参数们) 启动协程co并传入协程调用函数的参数&#xff0c;可以带回协程…

前端XMLHttpRequest、Fetch API、Axios实现文件上传、下载方法及后端Spring文件服务器处理方法

前言 本文总结Web应用开发中文件上传、下载的方法&#xff0c;即从前端表单输入文件并封装表单数据&#xff0c;然后请求后端服务器的处理过程&#xff1b;从基础的JavaScript中XmlHttpRequest对象、Fetch API实现上传、下载进行说明&#xff0c;并给出了前端常用的axios库的请…

[AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性

目录 背景描述 用浏览器访问&#xff0c;正常返回 ​编辑 AHK v2官方示例源代码 AHK v2运行结果报错(0x80092004) 找不到对象或属性 用thqby大佬的WinHttpRequest.ahk库测试报错 0x80092004 找不到对象或属性 附&#xff1a; 用Apifox访问&#xff0c;也正常返回 AHK v1 …

克洛托光电再度合作福晶科技,高精度光学镜头装调仪正式交付

近日&#xff0c;苏州东方克洛托光电技术有限公司&#xff08;下称“克洛托光电”&#xff09;高精度光学镜头装调仪正式交付于福建福晶科技股份有限公司&#xff0c;研发人员在现场完成设备安装调试并介绍使用方法。据悉&#xff0c;这已是双方第二次展开合作。 前沿产品力助推…

django之 annotate,aggrate

annotate&#xff1a;annotate() 不是一个终止子句。 annotate() 子句的输出是一个 QuerySet&#xff1b;这个 QuerySet 可以使用任何其他 QuerySet 操作进行修改&#xff0c;包括 filter()、order_by()&#xff0c;甚至对 annotate() 的额外调用。"增加一列属性" ag…

k8s中kubesphere开启devops总是报错解决

自己搭建过k8s集群遇到各种形式的报错&#xff0c;手动去解决&#xff0c;其实这都是由程序自动去解决的问题&#xff0c;由于自己的的失误导致问题不得不去亲自解决是虽然管用但费时费力&#xff0c;在kubersphere开启devops本身没什么问题&#xff0c;但由于虚拟机配置低导致…

SpringBoot+Vue实现简单的文件上传(策略模式)

SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 问题 前两篇文章&#xff0c;我们上传了txt、Excel文件&#xff0c;其实文件类型有很多种&#xff0c;如果我们的upload组件没有上传文件类型的限制&#xff0c;那么同一个…

MongoDB Shard 集群 Docker 部署

MongoDB Shard Docker 部署 部署环境 主机地址主机配置主机系统Mongodb1/192.168.31.1352CPU 4GBDebian12Mongodb2/192.168.31.1092CPU 4GBDebian12Mongodb3/192.168.31.1652CPU 4GBDebian12 镜像版本 mongodb/mongodb-community-server:5.0.27-ubuntu2004 部署集群 部署…

【tomcat】Tomcat如何扩展Java线程池原理

池化技术 在后端中&#xff0c;对于经常使用池化就是来提升系统性能&#xff0c;比如数据库连接池、线程池连接池等&#xff0c;本质都是利用空间换时间的来提升性能&#xff0c;用来避免资源的频繁创建和销毁&#xff0c;以此提高资源的复用率&#xff0c;所以合理设置系统所…

大语言模型诞生过程剖析

过程图如下 &#x1f4da; 第一步&#xff1a;海量文本的无监督学习 得到基座大模型&#x1f389; &#x1f50d; 原料&#xff1a;首先&#xff0c;我们需要海量的文本数据&#xff0c;这些数据可以来自互联网上的各种语料库&#xff0c;包括书籍、新闻、科学论文、社交媒体帖…

Object.assign方法有什么用?超详细测试用例、实例、可以在浏览器的控制台打印结果

Object.assign 是一个 JavaScript 方法&#xff0c;用于将一个或多个源对象的所有可枚举属性复制到目标对象中。它返回目标对象。这个方法常用于合并对象或浅复制对象。 语法 Object.assign(target, ...sources)target: 目标对象。sources: 一个或多个源对象。 示例 1. 合并…

【2024最新】C++扫描线算法介绍+实战例题

扫描线介绍&#xff1a;OI-Wiki 【简单】一维扫描线&#xff08;差分优化&#xff09; 网上一维扫描线很少有人讲&#xff0c;可能认为它太简单了吧&#xff0c;也可能认为这应该算在差分里&#xff08;事实上讲差分的文章里也几乎没有扫描线的影子&#xff09;。但我认为&am…

简单搭建卷积神经网络实现手写数字10分类

搭建卷积神经网络实现手写数字10分类 1.思路流程 1.导入minest数据集 2.对数据进行预处理 3.构建卷积神经网络模型 4.训练模型&#xff0c;评估模型 5.用模型进行训练预测 一.导入minest数据集 MNIST--->raw--->test-->(0,1,2...) 10个文件夹 MNIST--->raw-…