C++运算符详解
- 引言
- 一、运算符概述
- 二、算术运算符
- 三、复合运算符
- 四、关系运算符
- 五、逻辑运算符
- 六、位运算符(二进制位运算)
- 6.1、& 按位与
- 6.2、| 按位或
- 6.3、~ 按位取反
- 6.4、^ 按位异或
- 6.5、<< 左移:左边丢弃,右边补零
- 6.5、>> 右移:右边丢弃,左边补0或补1
- 七、三目运算符 ?:
- 八、运算符优先级
- 九、自增自减运算符
- 十、案例:产生随机数
引言
💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。
👉
🎖️ CSDN实力新星,社区专家博主
👉
🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、高级编程;掌握各个知识点。
👉
🔔 专栏地址:C++从零开始到精通
👉
🔔 博客主页:https://blog.csdn.net/Long_xu
🔔 上一篇:【009】C++数据类型之转义字符和类型转换
一、运算符概述
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++中运算符的优先级如下(从高到低):
- 括号:()
- 一元运算符:++ – ! ~ + - * & sizeof new delete
- 强制类型转换:(type)
- 乘除模运算符:* / %
- 加减运算符:+ -
- 移位运算符:<< >>
- 关系运算符: < <= > >=
- 相等运算符:== !=
- 按位与运算符:&
- 按位异或运算符:^
- 按位或运算符:|
- 逻辑与运算符:&&
- 逻辑或运算符:||
- 条件运算符:? :
- 赋值运算符:= += -= *= /= %= <<= >>= &= ^= |=
- 逗号运算符:,
注意,优先级从上到下,越靠上的优先级越高。例如,括号优先级最高,因此括号内的运算会先被执行。而逗号运算符的优先级最低,因此它的运算会在其他运算完成后才会被执行。
九、自增自减运算符
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;
}