C++系列六:运算符

news2024/11/30 10:49:43

C++运算符

    • 1. 算术运算符
    • 2. 关系运算符
    • 3. 逻辑运算符
    • 4. 按位运算符
    • 5. 取地址运算符
    • 6. 取内容运算符
    • 7. 成员选择符
    • 8. 作用域运算符
    • 9. 总结

1. 算术运算符

算术运算符用于执行基本数学运算,例如加减乘除和取模等操作。下表列出了C++中支持的算术运算符:

运算符描述示例
+ + +加法a + + +b
− - 减法a-b
∗ * 乘法a ∗ * b
/ / /除法a / / /b
% 取模a % b

其中,a和b代表要进行计算的两个变量或值。

(1)加法运算符

加法运算符(+)用于将两个值相加。如果两个操作数都是数字,则它们将被相加。如果其中一个操作数是字符串,则它们将被连接起来。

e.g.

int a = 5;
int b = 3;
int c = a + b; // c的值为8
std::string str1 = "Hello, ";
std::string str2 = "world!";
std::string str3 = str1 + str2; // str3的值为"Hello, world!"

(2)减法运算符

减法运算符(-)用于将第一个操作数减去第二个操作数。

e.g.

int a = 5;
int b = 3;
int c = a - b; // c的值为2

(3)乘法运算符

乘法运算符(*)用于将两个数相乘。

e.g.

int a = 5;
int b = 3;
int c = a * b; // c的值为15

(4)除法运算符

除法运算符(/)用于将第一个操作数除以第二个操作数。

e.g.

int a = 6;
int b = 3;
int c = a / b; // c的值为2

注意,C++中整数除法返回整数结果,即舍去小数部分。

(5)取模运算符

取模运算符(%)返回除法的余数。

e.g.

int a = 7;
int b = 3;
int c = a % b; // c的值为1

2. 关系运算符

关系运算符用于比较两个值并返回布尔值(true或false)。下表列出了C++中支持的关系运算符:

运算符描述示例
==相等a == b
!=不相等a != b
>大于a > b
<小于a < b
>=大于等于a >= b
<=小于等于a <= b

其中,a和b代表要进行比较的两个变量或值。

(1)相等和不相等运算符

相等运算符(==)用于比较两个值是否相等。如果它们相等,则返回true,否则返回false。

e.g.

int a = 5;
int b = 3;
bool c = (a == b); // c的值为false

不相等运算符(!=)用于比较两个值是否不相等。如果它们不相等,则返回true,否则返回false。

e.g.

int a = 5;
int b = 3;
bool c = (a != b); // c的值为true

(2)大于和小于运算符

大于运算符(>)用于比较第一个操作数是否大于第二个操作数。如果是,则返回true,否则返回false。

e.g.

int a = 5;
int b = 3;
bool c = (a > b); // c的值为true

小于运算符(<)用于比较第一个操作数是否小于第二个操作数。如果是,则返回true,否则返回false。

e.g.

int a = 5;
int b = 3;
bool c = (a < b); // c的值为false

(3)大于等于和小于等于运算符

大于等于运算符(>=)用于比较第一个操作数是否大于或等于第二个操作数。如果是,则返回true,否则返回false。

e.g.

int a = 5;
int b = 3;
bool c = (a >= b); // c的值为true

小于等于运算符(<=)用于比较第一个操作数是否小于或等于第二个操作数。如果是,则返回true,否则返回false。

e.g.

int a = 5;
int b = 3;
bool c = (a <= b); // c的值为false

3. 逻辑运算符

逻辑运算符用于执行布尔逻辑操作。下表列出了C++中支持的逻辑运算符:

运算符描述示例
&&逻辑与a && b
||逻辑或a
!逻辑非!a

其中,a和b代表要进行逻辑运算的两个布尔值。

(1)逻辑与运算符

逻辑与运算符(&&)用于检查两个条件是否都为真。只有当两个条件都为真时,才会返回true,否则返回false。

e.g.

bool a = true;
bool b = false;
bool c = (a && b); // c的值为false

(2)逻辑或运算符

逻辑或运算符(||)用于检查两个条件是否至少有一个为真。只有当两个条件都为假时,才会返回false,否则返回true。

e.g.

bool a = true;
bool b = false;
bool c = (a \|\| b); // c的值为true

(3)逻辑非运算符

逻辑非运算符(!)用于翻转一个布尔值。如果输入为true,则返回false,否则返回true。

e.g.

bool a = true;
bool b = !a; // b的值为false

4. 按位运算符

按位运算符用于操作二进制数据。下表列出了C++中支持的按位运算符:

运算符描述示例
&按位与a & b
|按位或a
^按位异或a ^ b
~取反~a
<<左移a << b
>>右移a >> b

其中,a和b代表要进行按位运算的两个整数。

(1)按位与运算符

按位与运算符(&)将两个二进制数的每一位进行比较,并且如果两位都为1,则该位输出1,否则输出0。

e.g.

int a = 5; // 二进制表示为101
int b = 3; // 二进制表示为011
int c = a & b; // c的值为1,二进制表示为001

(2)按位或运算符

按位或运算符(|)将两个二进制数的每一位进行比较,并且如果任意一位为1,则该位输出1,否则输出0。

e.g.

int a = 5; // 二进制表示为101
int b = 3; // 二进制表示为011
int c = a \| b; // c的值为7,二进制表示为111

(3)按位异或运算符

按位异或运算符将两个整数的二进制表示进行“异或”操作,并返回一个新的整数。当两个比特位相同时,该比特位结果为 0,否则为 1。

e.g.

int a = 5; // 二进制 101
int b = 3; // 二进制 011
int c = a ^ b; // 二进制 110 (即十进制 6)

(4)按位取反运算符

按位取反运算符对整数的二进制表示进行取反操作,并返回一个新的整数。当一个比特位为 0 时,结果为 1,否则为 0。

e.g.

int a = 5; // 二进制 101
int b = ~a; // 二进制 010 (即十进制 2)

(5)左移位运算符

左移位运算符将一个整数的二进制表示向左移动指定的位数,并返回一个新的整数。左移 n 位相当于将这个数乘以 2 的 n 次方。

e.g.

int a = 5; // 二进制 101
int b = a << 1; // 二进制 1010 (即十进制 10)

(6)右移位运算符

右移位运算符将一个整数的二进制表示向右移动指定的位数,并返回一个新的整数。右移 n 位相当于将这个数除以 2 的 n 次方。

e.g.

int a = 5; // 二进制 101
int b = a >> 1; // 二进制 10 (即十进制 2)

5. 取地址运算符

C++中,取地址运算符用于获取变量或对象的内存地址,表示为&,并且可以应用于任何变量、指针或对象。使用取地址运算符可以在程序中有效地管理内存和数据结构。

取地址运算符的一般语法如下:

&variable // 获取变量的地址

&object // 获取对象的地址

&type // 获取类型的地址

其中,“variable”表示要获取地址的变量,“object”表示要获取地址的对象,“type”表示要获取地址的类型。

e.g.

int a = 10;
int* ptr = &a; // 使用取地址运算符获取变量a的地址,并将其存储在指针ptr中

cout << "The value of a is: " << a << endl;
cout << "The address of a is: " << &a << endl;
cout << "The value of ptr is: " << ptr << endl;
cout << "The value pointed to by ptr is: " << *ptr << endl;

上述代码首先定义一个整数变量“a”,然后使用取地址运算符&获取它的地址,并将其存储在指针“ptr”中。接下来打印出变量“a”的值和地址、指针“ptr”的值以及指针所指向的值。

输出结果应该与以下内容类似:

The value of a is: 10
The address of a is: 0x7fff5fbff7dc
The value of ptr is: 0x7fff5fbff7dc
The value pointed to by ptr is: 10

从输出结果可以看出,变量“a”的地址与指针“ptr”的值相同,并且指针所指向的值与变量“a”的值相同。

6. 取内容运算符

在C++中,取内容运算符用于获取指针所指向的值,表示为*,并且可以应用于任何指针变量。

取内容运算符的一般语法如下:

*pointer // 获取指针所指向的值

其中,“pointer”表示要获取值的指针变量。

e.g.

int a = 10;
int* ptr = &a; // 使用取地址运算符获取变量a的地址,并将其存储在指针ptr中

cout << "The value of a is: " << a << endl;
cout << "The value pointed to by ptr is: " << *ptr << endl;

上述代码首先定义一个整数变量“a”,然后使用取地址运算符&获取它的地址,并将其存储在指针“ptr”中。接下来打印出变量“a”的值和指针“ptr”所指向的值。

输出:

The value of a is: 10
The value pointed to by ptr is: 10

从输出结果可以看出,指针“ptr”所指向的值与变量“a”的值相同。

7. 成员选择符

在C++中,成员选择符用于访问类的成员变量和成员函数。它表示为.(点号),并且可以应用于任何已定义的对象。使用成员选择符可以操作和修改对象的成员,从而实现面向对象编程。

成员选择符的一般语法如下:

object.member // 访问成员变量或成员函数

其中,“object”表示要访问成员的对象,“member”表示要访问的成员变量或成员函数。

e.g.

class MyClass {
public:
  int myVar;
  void myFunc() {
    cout << "Hello, world!" << endl;
  }
};

MyClass obj; // 创建MyClass对象

obj.myVar = 42; // 使用成员选择符访问myVar成员变量
cout << "The value of myVar is: " << obj.myVar << endl;

obj.myFunc(); // 使用成员选择符调用myFunc成员函数

上述代码首先定义了一个名为“MyClass”的类,该类包含一个整数类型的成员变量“myVar”和一个无参数无返回值的成员函数“myFunc”。接下来创建了一个名为“obj”的MyClass对象,并使用成员选择符访问其成员变量和成员函数。

输出:

The value of myVar is: 42
Hello, world!

从输出结果可以看出,我们成功地使用成员选择符访问了MyClass对象的成员变量和成员函数。

成员选择符 -> 用于访问结构体和类指针所指向的成员。它通常与动态内存分配函数 new 结合使用,来创建对象并进行操作。

e.g.

struct Person {
    std::string name;
    int age;
};

int main() {
    // 创建Person结构体指针p
    Person *p = new Person();

    // 通过成员选择符->访问p所指向的name成员变量
    p->name = "John";

    // 通过成员选择符->访问p所指向的age成员变量
    p->age = 30;

    delete p;
    return 0;
}

上述代码在动态内存中分配了一个新的Person结构体,并将其作为指针p进行访问。然后使用成员选择符 -> 访问指针p所指向的name和age成员。

需要注意的是,当使用普通对象(即不是指针)时,必须使用句点 . 而不是 -> 来访问成员。

8. 作用域运算符

C++的作用域运算符 :: 用于访问类、命名空间、结构体或枚举类型中的成员,以及访问全局变量和函数。

C++可以使用作用域运算符来区分同名的成员或变量,并指定需要访问的特定成员或变量。例如,当一个类的成员与它的父类具有相同的名称时,我们可以使用作用域运算符来访问这个类所定义的成员,而不是其父类中的成员。此外,在多个源文件中实现相同的函数时,可以使用作用域运算符来分隔全局命名空间和局部命名空间。

e.g. 访问类的成员

class A {
public:
    int x;
};

class B : public A {
public:
    int x;
};

int main() {
    B b;
    b.A::x = 5; // 访问A类中的x成员
    b.x = 10;   // 访问B类中的x成员

    return 0;
}

e.g. 访问命名空间中的变量或函数:

namespace MyNamespace {
    int x = 5;

    void printX() {
        std::cout << "x = " << x << std::endl;
    }
}

int main() {
    MyNamespace::printX(); // 访问MyNamespace中的printX函数
    std::cout << "MyNamespace::x = " << MyNamespace::x << std::endl; // 访问MyNamespace中的x变量

    return 0;
}

e.g. 访问全局变量:

int x = 10;

int main() {
    int x = 5;
    std::cout << "局部变量x = " << x << std::endl;

    std::cout << "全局变量x = " << ::x << std::endl; // 访问全局命名
}

9. 总结

20年前学习C++语言的幼稚记录

在这里插入图片描述

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

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

相关文章

JSON+AJAX+ThreadLocal+文件上传下载

文章目录 JSON和AJAX文档介绍1. JSON介绍1.1 JSON快速入门1.2 JSON和字符串转换1.2.1 JSON转字符串1.2.2 字符串转JSON1.2.3 JSON和字符串转换细节 1.3 JSON在java中使用1.3.1 Java对象和JSON字符串转换1.3.2 List对象和JSON字符串转换1.3.3 Map对象和JSON字符串转换 2. Ajax介…

DAY 58 数据库的存储引擎

存储引擎的概念 什么是存储引擎 MySQL中的数据用各种不下同的技术存储在文件中&#xff0c;每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力&#xff0c;这些不同的技术以及配套的功能在MySQL中称为存储引擎。 存储引擎是MySQL将数据存储在文…

JUC之volatile

作用&#xff1a;volatile是Java提供的一种轻量级的同步机制 保证内存可见性 不保证原子性 防止指令重排序 public class VolatileDemo {private static int num0;public static void main(String[] args) {new Thread(()->{while (num0){}},"A").start();try {…

Spark大数据处理讲课笔记4.6 Spark SQL数据源 - JDBC

文章目录 零、本讲学习目标一、Spark SQL读取关系数据库二、Spark SQL JDBC连接属性三、创建数据库与表&#xff08;一&#xff09;创建数据库&#xff08;二&#xff09;创建学生表&#xff08;二&#xff09;创建成绩表 四、读取和写入数据库表&#xff08;一&#xff09;利用…

力扣第 104 场双周赛 2681. 英雄的力量

原题链接力扣 题目大意&#xff1a;我开始看成连续子段了&#xff0c;写了个递归程序....... 一个数组任选一个子序列&#xff0c;子序列的力量值最大值平方*最小值。求所有子序列的力量和。 分析过程&#xff1a;如序列长度为n&#xff0c;子序列总数为2的n次幂&#xff0c…

SpringCloud------zookeeper代替Eureka,zookeeper版本冲突解决(七)

SpringCloud------zookeeper代替Eureka&#xff08;七&#xff09; SpringCloud整合zookeeper代替Eureka 注册中心zookeeper zookeeper是一个分布式协调工具&#xff0c;可以实现注册中心功能 关闭Linux服务器防火墙后&#xff0c;启动zookeeper服务器 zookeeper服务器取代Eur…

mac桌面文件删除怎么恢复?别急,有办法!

大家是不是习惯于将临时要用的文件都存放在桌面上。虽然文件放在桌面上&#xff0c;可以方便我们随时调取&#xff0c;但是也容易出现误删除的情况&#xff0c;给我们带来麻烦。mac桌面文件删除怎么恢复&#xff1f;希望通过本篇教程&#xff0c;你能找回误删除的桌面文件。 案…

script标签type值application/json,importmap和module

type&#xff08;默认text/javascript&#xff09; 该属性定义 script 元素包含或src引用的脚本语言。属性的值为 MIME 类型&#xff08;媒体类型&#xff09;&#xff1b; 如果没有定义这个属性&#xff0c;脚本会被视作 JavaScript。 如果 MIME 类型不是 JavaScript 类型&a…

GPT4结对编程实战,鹅厂一线研发真实使用感受

&#x1f449;腾小云导读 ChatGPT4相比ChatGPT3.5在逻辑推理能力上有很大的进步&#xff0c;其代码生成能力颇为优越。因此作者尝试在工作中某些不涉密的基础工作上&#xff0c;应用ChatGPT4来提升研发效率&#xff0c;简单尝试之后发现其在不少场景是有效的。本文将向大家展示…

元宇宙又“死”了!Epic老板:你当6亿用户是摆设?

“扎克伯格花了数年时间试图让Metaverse成为现实&#xff0c;但现在它已被AI取代&#xff0c;并走向科技创意的坟墓。”一篇表达“元宇宙已死”的文章近期在推特上引发热议&#xff0c;而游戏制作公司Epic Games CEO Tim Sweeney的还击更是让这个话题热上加热。 “搞一次在线守…

【SSL证书】使用mkcert创建局域网或单机可信任Windows格式证书

初学者对SSL证书的理解可能非常模糊。所谓SSL证书&#xff0c;其实它包含两个方面&#xff0c;一是根证书&#xff0c;二是HTTPS的证书&#xff0c;HTTPS证书合法性由其根证书来进行认定。几大证书供应商的根证书一般都预置在系统中了&#xff0c;所以给人的错觉就是只知HTTPS证…

深入解析 Facebook 分析工具,洞察用户行为和优化策略

作为一名 Facebook 运营者&#xff0c;了解用户行为和优化策略是至关重要的。在本文中&#xff0c;我们将深入解析Facebook 分析工具&#xff0c;帮助你更好地洞察用户行为和优化策略。 1.Facebook 像素 Facebook 像素是一个重要的工具&#xff0c;可以帮助运营者了解用户在网…

SNMP简介

背景 简单网络管理协议SNMP&#xff08;Simple Network Management Protocol&#xff09;用于网络设备的管理。网络设备种类多种多样&#xff0c;不同设备厂商提供的管理接口&#xff08;如命令行接口&#xff09;各不相同&#xff0c;这使得网络管理变得愈发复杂。为解决这一…

新车推迟、裁员降本,沃尔沃被现实狠狠“扇了一个耳光”

汽车行业的魅力&#xff0c;或许就在于不断的给自己打气&#xff0c;然后被打脸。 今年&#xff0c;上海车展开幕前&#xff0c;沃尔沃汽车大中华区销售公司总裁钦培吉在新车发布会上直言&#xff1a;“新势力会的&#xff0c;我们三年就学会了&#xff1b;我们会的&#xff0c…

无影云桌面,搭建一个属于自己的云上主机

无影云桌面&#xff0c;搭建一个属于自己的云上主机 1.无影云桌面介绍2.无影云桌面试用3.无影云桌面尝鲜4.测试云桌面的连通性5.体验无影云的娱乐办公场景6.将无影云桌面作为服务器使用7.无影云桌面使用总结 1.无影云桌面介绍 无影云桌面是一种云计算技术&#xff0c;可以将用…

《LKD3粗读笔记》(12)内存管理

1、页 内核把物理页作为内存管理的基本单元内存管理单元&#xff08;MMU&#xff09;以页为单位来管理系统中的页表从虚拟内存的角度看&#xff0c;页就是最小单位。体系结构不同&#xff0c;支持页的大小也不尽相同。大多数32位体系结构支持4KB的页&#xff0c;而64位体系结构…

排序算法之堆排序的实现

一、堆的相关概念 堆一般指的是二叉堆&#xff0c;顾名思义&#xff0c;二叉堆是完全二叉树或者近似完全二叉树 1. 堆的性质 ① 是一棵完全二叉树 ② 每个节点的值都大于或等于其子节点的值&#xff0c;为最大堆&#xff1b;反之为最小堆。 2. 堆的存储 一般用数组来表示堆&…

网站域名查询地址-域名所有者查询

域名查询注册信息查询 147SEO域名查询是一款全能的域名查询注册信息查询软件。它不仅提供了单个域名的实时查询功能&#xff0c;还支持批量域名查询功能&#xff0c;可以快速查询多个域名的注册和到期信息。以下是147SEO域名查询的主要特点&#xff1a; 批量域名查询&#xff…

基于【EasyDL】【图像分类】实现农作物病害识别小程序

内容、数据集来源:基于飞桨的农作物病害智能识别系统 - 飞桨AI Studio 项目背景 联合国粮食及农业组织的一份报告表明&#xff0c;每年农业生产的自然损失中有三分之一以上是由农业病虫害造成的&#xff0c;使这些成为当前影响农业生产和农业生产的最重要因素。需要考虑的农业…

浅谈Vue响应式

什么是响应式 不管是自己面试还是八股文告诉你的是&#xff0c;响应式描述的是视图与数据变化之间的一种关系。但这不够准确。 要要了解什么是响应式&#xff0c;我们必须了解不管是React,还是Vue其实本质就是一个函数。 那么我们可以形象的说&#xff1a;响应式描述的就是函数…