C++系列六:运算符

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++语言的幼稚记录

在这里插入图片描述

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

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

相关文章

为什么要做问卷调查?企业获得用户心声的捷径

问卷调查作为一种重要的数据收集方法&#xff0c;在市场营销、社会学研究、用户研究等领域得到广泛应用。通过问卷调查&#xff0c;我们可以了解受访者的态度、行为、需求等信息&#xff0c;进而为企业和组织的决策提供支持。那么&#xff0c;为什么要做问卷调查呢&#xff1f;…

day5 - 利用阈值勾勒

阈值处理在计算机视觉技术中占有十分重要的位置&#xff0c;他是很多高级算法的底层逻辑之一。本实验将练习使用图像阈值处理技术来处理不同的情况的图像&#xff0c;并获得图像轮廓。 完成本期内容&#xff0c;你可以&#xff1a; 了解图像阈值处理技术的定义和作用 掌握各阈…

苏州狮山广场能耗管理系统

摘要&#xff1a;随着社会生活水平的提高&#xff0c;经济的繁荣发展&#xff0c;人们对能源的需求逐渐增长&#xff0c;由此带来的能源危机日益严重。商场如何实时的了解、分析和控制商场的能源消耗已成为需要解决的迫在眉睫的难题。传统的能源消耗智能以月/季度/年为周期进行…

Autosar RTE S/R接口implicit与Explicit的实现与区别

文章目录 前言接口的代码implicitIReadIWrite ExplicitReadWrite 区别与使用场景总结 前言 Autosar官方文档阅读起来比较费劲&#xff0c;一般从实际应用中来了解更多规范中的内容。本文介绍最常用的RTE S/R接口的implicit隐式与Explicit显式两种方式的实现与差别 接口的代码…

Node.js

目录 Node.js是什么 入门案例 fs文件系统模块 案例 http模块 创建最简单的web服务器 网页跳转案例 模块化 模块化概念 模块化规范 Node.js 中模块的分类 加载模块 模块作用域 module对象 Node.js中的模块化规范 第三方模块 (包) 安装包的命令 卸载包的命令 …

oracle客户端的安装教程

文章目录 一、安装前的准备工作 1.1、百度网盘安装包的连接 1.2、百度网盘oracle11g软件包 二、oracle数据库客户端的安装与数据的准备 安装步骤 前言 本文主要讲解oracle客户端的安装与简单使用过程 一、安装前的准备工作 1.1、百度网盘安装包的连接 客户端的软件包 …

【Java EE 初阶】网络编程套接字UDP

目录 1.为什么需要网络编程&#xff1f; 2.什么是网络编程&#xff1f; 3.发送端和接收端 4.请求和响应 5.客户端和服务端 6.如何进行网络编程&#xff08;Socket套接字&#xff09; 1.如何进行网络编程 2.TCP与UDP的区别 1.流套接字&#xff1a;使用传输层TCP协议 2.…

面了一个测试工程师要求月薪23K,总感觉他藏了很多面试题...

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

【前端知识】Cookie, Session,Token和JWT的发展及区别(四)

【前端知识】Cookie, Session,Token和JWT的发展及区别&#xff08;四&#xff09; 9. JWT9.1 JWT的背景及定义&#xff08;1&#xff09;JWT的字面理解&#xff08;2&#xff09;JWT与传统Token的区别 9.2 JWT的组成&#xff08;1&#xff09; Header&#xff08;头部&#xff…

【负载均衡式在线OJ】 数据库

文章目录 41.使用Postman进行综合调试42.了解-前端预备52. 添加oj用户到MySQL53. 使用MySQL_Workbench创建表结构54. 测试录题功能55.重新设计oj_model56.编写oj_model具体代码57.MySQL综合测试58.结项与项目扩展思路 41.使用Postman进行综合调试 完善判题功能 先编译再测试 …

项目管理PMP好考吗,没有经验?

现在越来越多的产品经理和开发人员也投入到考PMP的大军中&#xff0c;在真实的项目中也会有很多产品经理兼任项目经理的职责&#xff0c;这点还是比较常见的&#xff0c;如果说产品或者开发人员考了PMP证书&#xff0c;本身也会让你在找工作的大军中更具有优势&#xff0c;俗话…

一文读懂selenium自动化测试(基于Python)

前言 我们今天来聊聊selenium自动化测试&#xff0c;我们都知道selenium是一款web自动化测试的工具&#xff0c;它应该如何去运用呢?我们接着看下去。 ​1、Selenium简介&#xff1a; 1.1 Selenium&#xff1a; Selenium是一款主要用于Web应用程序自动化测试的工具集合。Sele…

Vue事件

1&#xff0c;回顾js中的事件&#xff1f; 答&#xff1a;标签的状态变化或者被外物改变则称为事件。一般js中的事件都是由浏览器捕捉得到&#xff0c;然后传递给js引擎&#xff0c;浏览器检测到HTML页面中某个标签元素发生了指定的事件&#xff0c;而对应的DOM节点必须去调用回…

Python系列模块之标准库re详解

感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01; 目录 一、Python 正则表达式 1.1 re模块常用操作 1.2 re.match 1.3 re.search 1.4 re.findall 1.5 re.compile 函数 1.6 re.sub 检索和替换 1.7 re.split拆分 1.8 实战案例&#xff1a;根据文…

全网最全性能测试总结,分析性能测试问题+性能调优方案...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能分析和优化一…

vs code 配置net 开发环境.并搭配vs相似的解决方案面板

由于在本人在Linux22.04下安装Rider 一直处于卡死系统状态.不得不使用该方式 以下为安装步骤 安装 VS code https://code.visualstudio.com/Download 安装 mono https://www.mono-project.com/download/stable/#download-lin 安装 NET SDK https://learn.microsoft.com/zh…

加拿大鹅Q4营收增长超30%,后续如何拿下更多“信任票”?

羽绒服行业正处在一个大混战的时代。有的品牌依托强势单品出海逆袭&#xff1b;有的品牌通过狂追当下Z世代的喜好&#xff0c;推翻经典设计&#xff1b;也有品牌“放下架子”在工厂忙起了特惠直播。在赛道愈发拥挤的背景下&#xff0c;羽绒服行业正在经历“地位”洗牌。 目前&…

如何在WordPress页面上显示或隐藏小部件?

您想在 WordPress 网站的特定页面上显示或隐藏小部件吗&#xff1f; 默认情况下&#xff0c;当您将小部件添加到您的网站时&#xff0c;它们将显示在所有页面上。但是&#xff0c;有时您可能只想在某些页面上显示选定的小部件可以帮助您更好地自定义您的网站并提供个性化的用户…

有哪些好用的App云测试平台?

一、国内外6种好用app云测平台推荐&#xff08;章节末附pk图&#xff09; 1、国内云测平台 1&#xff09;Testin云测 网址&#xff1a;https://www.testin.cn/ Testin云测平台是一款基于云端的移动应用测试平台&#xff0c;为移动应用开发者和测试人员提供一站式的移动应用质…

让数据背后的那些话创造价值 | 数据增长

从行业背景而言&#xff0c;流量红利逐渐消失&#xff0c;野蛮生长的互联网时代接近尾声。传统的烧钱模式、靠体力投放的形式日渐乏力。但是&#xff0c;企业总是要追求增长的。所以在行业大背景下&#xff0c;依靠技术和数据的力量寻求更科学、更高效的方法达成营销目标&#…