「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; // 访问成员x

Point* 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++系列」一篇文章说透【存储类】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 ——— 模拟实现strcpy函数

目录 strcpy函数功能介绍 strcpy函数的模拟实现 strcpy函数功能介绍 学习并使用strcpy函数-CSDN博客 strcpy函数的模拟实现 代码演示&#xff1a; #include<stdio.h> #include<assert.h> char* my_strcpy(char* destination, const char* source) {assert(des…

OpenCV下的单目标定,双目标定与立体校正(calibrateCamera, stereoCalibrate and stereoRectify)

OpenCV下的单目标定&#xff0c;双目标定与立体校正(calibrateCamera, stereoCalibrate and stereoRectify) 文章目录 1. 杂话2. 单目标定2.1 先看代码2.2 一点解释2.3 calibrateCamera参数 3. 双目标定3.1 先看代码3.2 stereoCalibrate参数 4. 立体校正4.1 先看代码4.2 一点解…

Spring Security 授权

基于request的授权 HttpSecurity 权限配置 Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> {authorize// 放行请求:针对含有 admin 权限的用户放行 /user/get 接口.requestMatchers("/us…

训练营第十一天 | 150. 逆波兰表达式求值

150. 逆波兰表达式求值 做题思路 遇到操作符&#xff0c;出栈&#xff0c;从栈口取出俩元素&#xff1b;遇到数字&#xff0c;入栈 栈的应用场景&#xff1a;相邻元素的消除 逆波兰表达式&#xff1a;即后缀表达式 来自二叉树的后序遍历&#xff1a;左右中 代码细节 class …

有限元中弱形式的一些数学基础

有限元方法在求解PED时&#xff0c;一般先将控制方程转化为等效的若积分形式&#xff0c;本文试图总结一下这一过程的一些数学基础&#xff0c;本文主要从工程的角度出发和理解&#xff0c;不探讨严谨的数学证明过程。 PDE强形式 强形式是PDE及其边界条件的原始形式。求解强…

Java巅峰之路---基础篇---综合练习(面向对象)

目录 文字版格斗游戏 基础版 souf输出语句 进阶版 键盘录入的说明 复杂对象数组练习 需求&#xff1a; 添加和遍历 删除和遍历 修改和遍历 文字版格斗游戏 基础版 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;在选定人…

[BJDCTF2020]Mark loves cat

黑盒直接扫 dirsearch -u http://bba9a212-64d3-4a16-88b4-3605fe3ef749.node5.buuoj.cn:81/ -w /home/kali/Desktop/dirsearch/db/dicc.txt我们用GitHack拿一下源码 没有的去下载一下&#xff0c;开源代码 cd GitHackpython GitHack.py http://bba9a212-64d3-4a16-88b4-3605…

排序算法3_冒泡排序、快速排序

一、冒泡排序 1.1 冒泡排序定义和思路 冒泡排序的基本思想是&#xff1a;通过相邻两个元素之间的比较和交换&#xff0c;使较大的元素逐渐从前面移向后面&#xff08;升序&#xff09;&#xff0c;就像水底下的气泡一样逐渐向上冒泡&#xff0c;所以被称为“冒泡”排序。  在…

垃圾收集篇

文章目录 垃圾收集算法垃圾的概念对象存活的判断引用计数器法可达性分析算法 算法标记清除算法复制算法标记压缩算法 垃圾收集的相关概念STW安全点安全区域 垃圾收集器重要指标吞吐量停顿时间 垃圾收集器的分类Serial 收集器&#xff1a;串行回收ParNew 收集器&#xff1a;并行…

【可视化大屏系列】Echarts之饼图绘制

本文为个人近期学习总结&#xff0c;若有错误之处&#xff0c;欢迎指出&#xff01; Echarts之饼图绘制 前言1.需求2.实现效果3.大概思路4.代码实现子组件写法父组件写法 5.附加&#xff08;1&#xff09;圆环饼图的绘制&#xff08;2&#xff09;南丁格尔玫瑰饼图A.半径展示数…

新手小白的pytorch学习第三弹-------tensor的基本操作

reshape, view, stacking, squeeze(), unsqueeze(),permute()torch.tensor 和 numpy 的 array切片&#xff0c;张量里面获取元素值随机种子 1 导入torch import torch2 reshape() tensor_A torch.arange(1, 11) tensor_Atensor_A.reshape(2, 5) tensor_A.reshape(2, 5)tenso…

浮点数存储方法(float,double,long double)

前言&#xff1a; 浮点数家族包括float、double、long double 类型。 如果你打出3.14&#xff0c;编译器默认是double类型的。若想让他为float类型&#xff0c;则要在前面加f&#xff1b; 1E10是科学计数法&#xff0c;代表1.010^10 (1) 浮点型如何在内存中存放&#xff1f;…

husky 和 lint-staged 构建代码项目规范

目录 前言 最简单的方法 过 scripts 来解决如果检测工具多&#xff0c;需要多次处理 通过 husky(哈士奇)来解决容易遗忘的问题 1. 安装 2. husky init 3. 试一试​ lint-stadge 只 lint 改动的 1. 安装 2. 修改 package.json 配置 3. 添加 npm 脚本: 4.使用 Husky…

Linux的load(负载)

负载(load)是Linux机器的一个重要指标&#xff0c;直观了反应了机器当前的状态。 在Linux系统中&#xff0c;系统负载是对当前CPU工作量的度量&#xff0c;被定义为特定时间间隔内运行队列中的平均线程数。 Linux的负载高&#xff0c;主要是由于CPU使用、内存使用、10消…

【AI】目标检测算法【R-CNN:Regions with CNN features】

1. 常用目标检测算法介绍 目标检测是计算机视觉领域的一个重要分支&#xff0c;它旨在识别并定位图像中的各种对象。以下是一些流行的目标检测算法&#xff1a; 1.1 二阶段目标检测算法 R-CNN (Regions with CNN features): 通过选择性搜索算法选取候选区域&#xff0c;然后…

【C语言】详解结构体(上)

文章目录 前言1. 结构体类型的含义2.结构体的声明2.1 结构体声明的语法2.2 结构体变量的创建和初始化 3.结构体的特殊声明4. 结构体的自引用5.小结 前言 C语言的数据类型分为内置数据类型和自定义的数据类型。所谓的内置的数据类型可以认为是C语言自带的数据类型&#xff08;c…

【网络安全】基于PHP study的DVWA靶场搭建教程

PHP study的安装本文略过 DVWA安装地址 https://github.com/digininja/DVWA?tabreadme-ov-file将zip文件安装至PHP study的www目录下&#xff1a; 解压&#xff0c;进入config目录中&#xff0c;将.dist后缀删除&#xff1a; 接着打开该php文件&#xff0c;将用户名、密码改为…

程序包不存在【java: 程序包org.springframework.boot不存在】

1、问题提示&#xff1a;java: 程序包org.springframework.boot不存在 注意&#xff1a;已经下载好了程序包&#xff0c;就是提示不存在 2、解决办法

Qt5离线安装包无法下载问题解决办法

Qt5离线安装包无法下载问题解决办法 文章目录 Qt5离线安装包无法下载问题解决办法1、前言2、Qt5安装包下载办法 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;Qt开发经验 &#x1f448; 1、前言 Qt安装包官方下载地址 Qt5离线安装包目前在国内已经被墙…

链表的回文结构(链表的中间节点+反转链表)

链表的回文结构 一.链表的中间节点思路1&#xff1a;暴力求解思路2&#xff1a;快慢指针 二.返回倒数第k个节点思路1&#xff1a;暴力求解思路2&#xff1a;快慢指针 三.反转链表思路1&#xff1a;头插法思路2&#xff1a;反转指针的指向 四.链表的回文结构思路1&#xff1a;利…