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


在这里插入图片描述

一、运算符

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

相关推荐

  1. 【生成对抗网络GAN】文章

    2024-07-15 10:16:03       36 阅读
  2. 文章所有Python知识

    2024-07-15 10:16:03       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 10:16:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 10:16:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 10:16:03       58 阅读
  4. Python语言-面向对象

    2024-07-15 10:16:03       69 阅读

热门阅读

  1. 聊聊自动驾驶中的LiDAR和Radar

    2024-07-15 10:16:03       20 阅读
  2. python安全脚本开发简单思路

    2024-07-15 10:16:03       25 阅读
  3. 使用C++和libcurl下载指定的文件

    2024-07-15 10:16:03       25 阅读
  4. 微信小程序开发入门指南

    2024-07-15 10:16:03       21 阅读
  5. 等保测评全流程详解

    2024-07-15 10:16:03       20 阅读
  6. Writing Bazel rules: data and runfiles

    2024-07-15 10:16:03       20 阅读
  7. AcWing 667. 游戏时间

    2024-07-15 10:16:03       24 阅读
  8. 面向对象的开发方法

    2024-07-15 10:16:03       26 阅读
  9. 板级调试小助手(3)基于PYNQ的OLED视频显示

    2024-07-15 10:16:03       24 阅读