【010】掌握C++运算符:编程基础的深入研究

引言


💡 作者简介:专注分享高性能服务器后台开发技术知识,涵盖多个领域,包括C/C++、Linux、网络协议、设计模式、中间件、云原生、数据库、分布式架构等。目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。公众号《Lion 莱恩呀》。
👉
🎖️ CSDN实力新星、专家博主,阿里云博客专家、华为云云享专家
👉
🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、高级编程;掌握各个知识点。
👉
🔔 专栏地址:C++从零开始到精通
👉
🔔 博客主页:https://blog.csdn.net/Long_xu


🔔 上一篇:【009】C++数据类型之转义字符和类型转换
🔔 下一篇:【011】C++选择控制语句 if 和 switch 详解

一、运算符概述

C++运算符是指用于执行特定操作的符号或符号组合。以下是常见的C++运算符:

  1. 算术运算符:加(+)、减(-)、乘(*)、除(/)、取余(%)等。

  2. 比较运算符:等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。

  3. 逻辑运算符:与(&&)、或(||)、非(!)等。

  4. 位运算符:按位与(&)、按位或(|)、异或(^)、左移(<<)、右移(>>)等。

  5. 赋值运算符:赋值(=)、复合赋值(+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=)等。

  6. 条件运算符:条件表达式(? : )。

  7. 逗号运算符:逗号(,)。

  8. 成员访问运算符:点(.)、箭头(->)。

  9. 自增自减运算符:自增(++)、自减(–)。

  10. 类型运算符:sizeof。

  11. 强制类型转换运算符:static_cast、reinterpret_cast、dynamic_cast、const_cast。

  12. 其他运算符:newdelete、地址运算符(&)、间接寻址运算符(*)、条件编译运算符(#if#else#endif)、lambda运算符([])等。

用算术运算符将运算对象连接起来的,符合C++语法规则的表达式,称为C++算术表达式,运算对象包括常量、变量、函数返回值等。例如:
在这里插入图片描述
特别地:

  • 需要一个运算对象的叫单目运算符。
  • 需要两个运算对象的叫双目运算符。
  • 需要三个运算对象的叫三目运算符。
  • 需要多个运算对象的叫多目运算符。

二、算术运算符

算术运算符有:加(+)、减(-)、乘(*)、除(/)、取余(%)等。

(1)除(/)的取整:如果 / 的所有运算对象都是整数, / 的功能就是取整。

5/3 == 1;
5/2 == 2;

(2)除(/)的除法运算符:如果 / 有一个运算对象是实型, / 的功能就是除法运算。

5/2.0 == 2.5;

(3)取余(%)运算符。

5%2 == 1;
3%5 == 3;

示例:键盘输入一个数,判断能否被3整除。

#include <iostream>

using namespace std;

int main()
{
	int data = 0;
	cout << "请输入一个整数:";
	cin >> data;

	if (data % 3 == 0)
		cout << data << " 可以被 3 整除" << endl;
	else
		cout << data << " 不可以被 3 整除" << endl;

	return 0;
}

输出:

请输入一个整数:16
16 不可以被 3 整除

使用rand()函数产生一个60~100的随机数。

// 60= 60 + 0;
// 100 = 60 + 40;
// 因此,data%n=n-1;推导出 n-1=40;所以n=41; 
// 所以取余的数是41。
rand()%41 + 60;

使用rand()函数产生一个'a' ~ 'z' 的随机字母。

// 'a'= 'a' + 0;
// 'z' = 'a' + 25;(26个字母,从0开始算就是0~25)
// 因此,data%n=n-1;推导出 n-1=25;所以n=26; 
// 所以取余的数是41。
rand()%26 + 'a';

三、复合运算符

+=、-=、*=、/=、%=等。

a+=b;// a=a+b;
a-=b;// a=a-b;
a/=b;// a=a/b;
a%=b;// a=a%b;

特别需要注意的是:一定要把等号右边看成一个整体。

int a=3;
a*=4+5;//a=a*(4+5);
// a=27;

示例:

int a=0;
a+=a-=a*=a;//根据运算符优先级,从右往左运算;
// a=0;
// 规律,只要看到中间有a-=a;则必定为0。

四、关系运算符

等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。

特别需要注意的是,等号一定要在右边。

=< 是错误的。
=< 是错误的。

示例:
在这里插入图片描述

五、逻辑运算符

与(&&)、或(||)、非(!)等。

(1)与(&&):只要有一个为假,则整个表达式为假,否则为真。
(2)或(||):只要有一个为真,则整个表达式为真,否则为假。
(3)非(!):把真变为假,假变为真。

需要注意的是,&&和||都有一些特性:

  • 如果&&中检测到一个对象为假,则直接判断为假,因为后面的判断对结果已经不起影响了。
  • 如果||中的检测到一个对象为真,则直接判断为真,因为后面的判断对结果已经不起影响了。

在c语言中,除了0是假,其他都为真。

六、位运算符(二进制位运算)

按位与(&)、按位或(|)、异或(^)、左移(<<)、右移(>>)等。

6.1、& 按位与

规律:全1为1,有0为0。
特点:和1相与保持不变,和0相与为0。
场景:将指定位清零。

  1100 0011
& 1111 0000
---------------
  1100 0000

示例:将一个字节的第三第四位清零,其他保持不变。

unsigned char data;
data=data & 0xe7;// 0xe7 = 1110 0111
data&=0xe7;//等效

6.2、| 按位或

规律:全0为0,有1为1。
特点:有1置1,有0保持不变。
场景:将指定位置1。

  1100 0011
| 1111 0000
---------------
  1111 0011

示例:将一个字节的第五、六个位置置1,其他保持不变。

unsigned char data;
data=data | 0x60;// 0x60 = 0110 0000
data|=0x60;//等效

6.3、~ 按位取反

规律:0变1,1变0。

一般用来配合其他位运算符。

~1100 0011 = 0011 1100;

6.4、^ 按位异或

规律:相同为0,不同为1。
特点:和1异或取反,和0异或保持不变。
场景:将指定位发生翻转。

  1100 0011
^ 1111 0000
---------------
  0011 0011

6.5、<< 左移:左边丢弃,右边补零

移动的位数不要超过自身位的宽度。

在这里插入图片描述
规律:左移多少,相当于乘上2的n次方。

char data=0000 0001;
// 左移0位:
data=data<<0;// = data*2^0;
// 左移1位:
data=data<<1;// = data*2^1;
// 左移2位:
data=data<<2;// = data*2^2;
// 左移3位:
data=data<<3;// = data*2^3;
// ......

6.5、>> 右移:右边丢弃,左边补0或补1

在这里插入图片描述
算术右移、逻辑右移都是编译器决定的,用户无法确定。

无符号:右边丢弃,左边补0。

有符号:

  • 正数:右边丢弃,左边补0。
  • 负数:右边丢弃,左边补1(算术左移)。
  • 负数:右边丢弃,左边补0(逻辑左移)。

规律:左移多少,相当于除上2的n次方。

unsigned char data=1000 0000;
// 左移0位:
data=data>>0;// = data除上2^0;
// 左移1位:
data=data>>1;// = data除上2^1;
// 左移2位:
data=data>>2;// = data除上2^2;
// 左移3位:
data=data>>3;// = data除上2^3;
// ......

七、三目运算符 ?:

C++中的三目运算符是一种条件表达式,也称为条件运算符。它的语法如下:

condition ? expression1 : expression2;

其中,condition是一个条件表达式,如果它的值为真,则返回expression1的值;否则,返回expression2的值。

例如,以下代码使用三目运算符计算两个数的最大值:

#include <iostream>
using namespace std;

int main() {
    int a = 10;
    int b = 20;
    int max_num = (a > b) ? a : b;
    cout << "Max number is " << max_num << endl;
    return 0;
}

输出结果为:

Max number is 20

在上面的代码中,如果a大于b,则max_num等于a,否则max_num等于b。

八、运算符优先级

C++中运算符的优先级如下(从高到低):

优先级运算符类型运算符
1括号()
2一元运算符++ -- ! ~ + - * & sizeof new delete
3强制类型转换(type)
4乘除模运算符* / %
5加减运算符+ -
6移位运算符<< >>
7关系运算符< <= > >=
8相等运算符== !=
9按位与运算符&
10按位异或运算符^
11按位或运算符|
12逻辑与运算符&&
13逻辑或运算符||
14条件运算符?:
15赋值运算符= += -= *= /= %= <<= >>= &= ^= |=
16逗号运算符,

注意,优先级从上到下,越靠上的优先级越高。例如,括号优先级最高,因此括号内的运算会先被执行。而逗号运算符的优先级最低,因此它的运算会在其他运算完成后才会被执行。

九、自增自减运算符

C++ 中的自增运算符(++)和自减运算符(–)是一种特殊的算术运算符,用于增加或减少一个变量的值。它们可以作为前缀或后缀操作符使用。

前缀形式:操作符位于变量名之前(例如 ++i),此时变量的值会在计算前先自增或自减一次,然后返回该变量的新值。

后缀形式:操作符位于变量名之后(例如 i++),此时变量的值会在计算之后自增或自减一次,但是表达式的结果仍为原始值,只有下一次使用该变量时才会体现出自增或自减的效果。

示例:

int i = 1;
cout << ++i; // 输出 2,因为 i 先自增一次再输出
cout << i++; // 输出 2,但 i 的值已经自增了一次,下一次使用 i 时就会体现出来
cout << i;   // 输出 3,因为 i 自增了一次

十、案例:产生随机数

rand()函数是一个伪随机数,所以每次产生随机数之前必须要设置随机数种子,使用srand()函数。为了保证每次执行都会设置一个变化的种子,我们把时间传给srand()。种子只需要设置一次。

#include <iostream>
#include <time.h>
using namespace std;

int main()
{
	srand(time(NULL));
	cout<<rand()<<endl;
	return 0;
}

十一、总结

本文深入探讨了C++中的各种运算符,从基本的算术运算符到复杂的位运算符和条件运算符。通过详细的解释和示例代码,了解了这些运算符的功能、用法和注意事项。

  • 运算符概述: 介绍了C++中常见的运算符类型,包括算术运算符、比较运算符、逻辑运算符、位运算符等,以及它们在表达式中的应用。
  • 算术运算符: 详细讨论了加减乘除等算术运算符的使用方法,并举例说明了除法运算符的取整功能和取余运算符的应用场景。
  • 复合运算符: 探讨了+=、-=、*=等复合赋值运算符的使用方法和注意事项,以及它们在代码中的实际应用。
  • 关系运算符: 解释了等于、不等于、大于、小于等关系运算符的功能和使用规则,以及在条件判断和流程控制中的应用。
  • 逻辑运算符: 介绍了与、或、非等逻辑运算符的特性,以及它们在逻辑判断和条件组合中的应用场景。
  • 位运算符: 深入讨论了按位与、按位或、按位异或等位运算符的功能和特点,以及它们在处理二进制数据和位操作中的应用。
  • 三目运算符: 解释了条件表达式中的三目运算符的语法和使用方法,以及在简化代码逻辑和提高代码可读性方面的作用。
  • 运算符优先级: 总结了C++中各类运算符的优先级顺序,帮助开发者正确理解表达式的计算顺序和避免优先级导致的错误。
  • 自增自减运算符: 探讨了自增(++)和自减(–)运算符的前缀和后缀形式的区别,以及在代码中的实际应用场景。

通过本文的学习,读者可以更加深入地理解C++中各种运算符的作用和用法,并能够灵活运用它们解决实际的编程问题。同时,我们也强调了编写清晰、简洁、高效的代码的重要性,希望读者在实际编程中能够运用所学知识,提高编程水平和代码质量。
在这里插入图片描述

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
C++ 中的面向对象编程允许我们使用类和对象来组织和管理代码。在类中,可以定义成员函数和成员变量。成员函数是与类相关联的函数,它们可以访问类的成员变量并执行与该类相关的操作。成员变量是存储在类中的变量,它们描述了类的状态。 运算符重载是 C++ 中面向对象编程的一种强大功能。它允许您重新定义运算符以执行特定操作。例如,您可以重载“+”运算符以执行类对象的加法操作。运算符重载使您能够编写更直观和易于使用的代码。 友元函数是类的非成员函数,但它们可以访问类的私有成员。当您需要访问类的私有成员但不想使这些成员成为公共接口的一部分时,友元函数就会很有用。要声明一个友元函数,请在类定义中将其声明为友元。友元函数可以是全局函数或其他类的成员函数。 下面是一个示例类,其中包含运算符重载和友元函数: ```cpp #include <iostream> class MyClass { public: MyClass(int value) : value_(value) {} // 重载加号运算符,将两个 MyClass 对象相加 MyClass operator+(const MyClass& other) { return MyClass(value_ + other.value_); } // 将友元函数声明为 MyClass 的友元 friend void PrintValue(const MyClass& obj); private: int value_; }; // MyClass 的友元函数 void PrintValue(const MyClass& obj) { std::cout << "The value of MyClass is: " << obj.value_ << std::endl; } int main() { MyClass obj1(10); MyClass obj2(20); MyClass result = obj1 + obj2; PrintValue(result); return 0; } ``` 在这个例子中,我们定义了一个 MyClass 类,它包含一个成员变量 value_ 和一个构造函数。我们还重载了加号运算符,以便我们可以将 MyClass 对象相加。最后,我们定义了一个名为 PrintValue 的友元函数,该函数可以访问 MyClass 类的私有成员 value_。 在 main 函数中,我们创建了两个 MyClass 对象,将它们相加并将结果打印到控制台上。请注意,我们使用了友元函数 PrintValue 来打印 MyClass 对象的值,而不是直接访问 MyClass 对象的私有成员。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lion Long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值