C++运算符详解
引言
💡 作者简介:专注分享高性能服务器后台开发技术知识,涵盖多个领域,包括C/C++、Linux、网络协议、设计模式、中间件、云原生、数据库、分布式架构等。目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。公众号《Lion 莱恩呀》。
👉
🎖️ CSDN实力新星、专家博主,阿里云博客专家、华为云云享专家
👉
🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、高级编程;掌握各个知识点。
👉
🔔 专栏地址:C++从零开始到精通
👉
🔔 博客主页:https://blog.csdn.net/Long_xu
🔔 上一篇:【009】C++数据类型之转义字符和类型转换
🔔 下一篇:【011】C++选择控制语句 if 和 switch 详解
一、运算符概述
C++运算符是指用于执行特定操作的符号或符号组合。以下是常见的C++运算符:
-
算术运算符:加(
+
)、减(-
)、乘(*
)、除(/
)、取余(%
)等。 -
比较运算符:等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。
-
逻辑运算符:与(&&)、或(||)、非(!)等。
-
位运算符:按位与(
&
)、按位或(|
)、异或(^
)、左移(<<
)、右移(>>
)等。 -
赋值运算符:赋值(=)、复合赋值(+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=)等。
-
条件运算符:条件表达式(
? :
)。 -
逗号运算符:逗号(
,
)。 -
成员访问运算符:点(
.
)、箭头(->
)。 -
自增自减运算符:自增(++)、自减(–)。
-
类型运算符:sizeof。
-
强制类型转换运算符:static_cast、reinterpret_cast、dynamic_cast、const_cast。
-
其他运算符:
new
、delete
、地址运算符(&
)、间接寻址运算符(*
)、条件编译运算符(#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++中各种运算符的作用和用法,并能够灵活运用它们解决实际的编程问题。同时,我们也强调了编写清晰、简洁、高效的代码的重要性,希望读者在实际编程中能够运用所学知识,提高编程水平和代码质量。