「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,一经查实,立即删除!

相关文章

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的技术创新、市场表现以及未来的…

基于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…

[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;这已是双方第二次展开合作。 前沿产品力助推…

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

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

大语言模型诞生过程剖析

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

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

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

VRRP虚拟路由冗余技术

VRRP虚拟路由冗余技术&#xff1a;是一种路由容错协议&#xff0c;用于在网络中提供路由器的冗余备份。它通过将多个路由器虚拟成一个虚拟路由器并且多个路由器之间共享一个虚拟IP地址来实现冗余和高可用性。当承担转发业务的主路由器出现故障时&#xff0c;其他备份路由器可以…

安全防御:防火墙概述

目录 一、信息安全 1.1 恶意程序一般会具备一下多个或全部特点 1.2 信息安全五要素&#xff1a; 二、了解防火墙 2.1 防火墙的核心任务 2.2 防火墙的分类 2.3 防火墙的发展历程 2.3.1 包过滤防火墙 2.3.2 应用代理防火墙 2.3.3 状态检测防火墙 补充防御设备 三、防…

骑士人才系统74cms专业版实现本地VUE打包和在线升级方法以及常见问题

骑士人才系统我就不多说了目前来说我接触的人才系统里面除了phpyun就是骑士人才了&#xff0c;两个历史都很悠久&#xff0c;总起来说功能方面各分伯仲&#xff0c;前几期我作过Phpyun的配置教程这次我们针对骑士人才系统说说怎么使用VUE源码本地一键打包后台和在线升级方式&am…

每日Attention学习10——Scale-Aware Modulation

模块出处 [ICCV 23] [link] [code] Scale-Aware Modulation Meet Transformer 模块名称 Scale-Aware Modulation (SAM) 模块作用 改进的自注意力 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as Fclass SAM(nn.Module):def __init__…

redisTemplate报错为nil,通过redis-cli查看前缀有乱码

public void set(String key, String value, long timeout) {redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);} 改完之后 public void set(String key, String value, long timeout) {redisTemplate.setKeySerializer(new StringRedisSerializer()…

opencascade AIS_InteractiveContext源码学习8 trihedron display attributes

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…

最优化(10):牛顿类、拟牛顿类算法

4.4 牛顿类算法——介绍了经典牛顿法及其收敛性&#xff0c;并介绍了修正牛顿法和非精确牛顿法&#xff1b; 4.5 拟牛顿类算法——引入割线方程&#xff0c;介绍拟牛顿算法以及拟牛顿矩阵更新方式&#xff0c;然后给出了拟牛顿法的全局收敛性&#xff0c;最后介绍了有限内存BFG…

Java中创建线程的方式

文章目录 创建线程ThreadRunnableCallable线程池创建方式自定义线程池线程池工作原理阻塞队列线程池参数合理配置线程池参数 创建线程 在Java中创建一个线程&#xff0c;有且仅有一种方式&#xff0c;创建一个Thread类实例&#xff0c;并调用它的start方法。 Thread 最经典也…

在Linux上设置MySQL允许远程连接的完整指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

【Linux】多线程_6

文章目录 九、多线程7. 生产者消费者模型生产者消费者模型的简单代码结果演示 未完待续 九、多线程 7. 生产者消费者模型 生产者消费者模型的简单代码 Makefile&#xff1a; cp:Main.ccg -o $ $^ -stdc11 -lpthread .PHONY:clean clean:rm -f cpThread.hpp&#xff1a; #i…

【Linux】Linux必备的基础指令

目录 Linux必备的基础指令一 、 什么是Linux二、 Linux常用命令2.1 ls2.2 pwd2.3 cd2.4 touch2.5 cat2.6 mkdir2.7 rm 三、 Linux重要指令3.1 cp3.2 mv3.3 tail3.4 vim3.5 grep3.6 ps3.7 netstat Linux必备的基础指令 一 、 什么是Linux 系统编程&⽹络编程 Linux⾃⾝提供…