C++学习笔记之运算符【超详细】

232 阅读7分钟

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号

一般地,运算符有六种:

  • 算术运算符
  • 逻辑运算符
  • 赋值运算符
  • 关系运算符
  • 位运算符
  • 其他运算符

运算符.png


1.算术运算符

算术运算符含义
+两个数相加
-两个数相减
*两个数相乘
/两个数相除
%两个数相除,取余数
++整数值增加 1
--整数值减少 1

实例如下:


#include <iostream>
using namespace std;
int main ()
{
int i = 21, j = 5;	//定义变量 i与 j,并初始化
int result ; 		//定义一个变量存放结果
cout<<"i=21, j=5\n算术结果如下:"<<endl; 
	
result = i + j; 
cout <<"i + j = "<<result<<endl;
 
result = i - j; 
cout <<"i - j = "<<result<<endl;
	
result = i * j; 
cout <<"i * j = "<<result<<endl;
	
result = i / j; 
cout<<"i / j = "<<result<<endl;
	
result =i % j; 
cout<<"i % j = "<<result<<endl;
	
result = ++i; 
cout<<"++i = "<<result<<endl;
	
result = --j; 
cout<<"--j = "<<result<<endl;
	
	return 0;
}

运行结果如下:


i=21, j=5
算术结果如下:
i + j = 26
i - j = 16
i * j = 105
i / j = 4
i % j = 1
++i = 22
--j = 4

注意:

  • 除法运算中,一个整数除以另一个整数,结果为商的整数部分(小数部分被舍弃,比如 9 / 5 = 1),但如果操作数中有一个是浮点数(或两个都是),则除法结果是浮点数(小数部分被保留)。
  • 取余运算中,即使用求模运算符 % 时,只能用于整数(浮点数无效)

2.逻辑运算符

逻辑运算符可以将多个表达式连接起来,从左到右,具有关联性。

  • 其逻辑表达式的结果为布尔值(真或假)
  • 真(true)用 1 表示,假(false)用 0 表示

逻辑运算符有三种:

符号含义作用
&&都为真才真
||有真就为真
真变假,假变真

2.1.逻辑与(&&)

&&运算符将多条表达式连接起来时,当表达式全为真时,该结果才为真(否则为假)

语法:

if ( (表达式一) && (表达式二) )
.
.
.
两条表达式的情况整体表达式的值
false && false0(false)
false && true0(false)
true && false0(false)
true && true1(true)

注意:

使用&&运算符时,存在短路情况, 即系统在编译时从左到右进行排查,只要有一个表达式为false,则整条式子就为false,无需排查剩下的表达式。


2.2.逻辑或(||)

||运算符将多条表达式连接起来时,只要有一条表达式为真,那么整条表达式就为真。

语法:

if ( (表达式一) && (表达式二) )
.
.
.
两条表达式的情况整体表达式的值
false && false0(false)
false && true1(true)
true && false1(true)
true && true1(true)

注意:

使用逻辑 || 运算符时也存在短路情况, 即当有一条表达式为true,那么整条表达式就为真,无需排查剩余的表达式。


2.3.逻辑非(!)

逻辑 !运算符实现逻辑非操作,也就是反转一个操作数的真或假。

语法:


if ( ! (表达式) )
{
    .
    .
    .
}

上述中的表达式若是真,使用 !运算符 后就返回假, if 语句将不会执行。 反之,表达式若为假,则 !运算符 就返回真,程序将执行 if 语句


3.赋值运算符

符号“=”就是赋值运算符。

  • " = "的作用是将一个数据赋给一个变量。
  • 如“a=3”的作用是把常量3赋给变量a。
  • 我们也可以将一个表达式的值赋给一个变量。
  • 我们在赋值符“=”之前加上其他运算符,就可以构成复合赋值运算符。

看下表:

符号实例
=A = 3;就是一个简单的赋值操作
+=B+=A;就等同于B=B+A;
-=B-=A;就等同于B=B-A;
*=B*=A;就等同于B=B*A;
/=B/=A;就等同于B=B/A;
%=B%=A;就等同于B=B%A;
&=B&=A;就等同于B=B&A;
^=B^=A;就等同于B=B^A;
|=B|A;就等同于B=B|A;
<<=B<<=A;就等同于B=B<<A;
>>=B>>=A;就等同于B=B>>A;

4.关系运算符

关系运算符用来确定两个值之间是否存在特定的关系

C++中的关系运算符有六种:

符号含义(是否)
大于
<小于
==等于
!=不等于
>=大于或等于
<=小于或等于
  • 使用关系运算符的表达式称为关系表达式
  • 其值为 true(1) 或 false(0) 。
  • 比如,如果 x=2,y=1,那么表达式 x>y 的值将为 true,表达式 x<y 的值则为 false。
  • 实际上,关系运算符在测试一对关系,是否等于(==),是否不等于(!=)

5.位运算符

  • 位是用以描述电脑数据量的最小单位。二进制系统中,每个0或1就是一个位。
  • 位运算符作用于位,将运算对象按二进制的方式操作,完成指定运算。
  • 位运算符一般用于处理二进制位的问题,且只能用于操作整型数。

5.1.按位取反' ~ '

按位取反运算符 ~,又称补码运算符。

取反,顾名思义,类似反转的效果,如二进制上的位如果是 0,则取反后为1,而位上是1的取反后为0。

比如:

  •   A = 00010001
  • ~A = 11101110

5.2.按位与' & '

规则:

如果相应的二进制位都为1,则该位的结果就为1,否则为0(类似逻辑"与")

比如:

  • A = 1010
  • B = 1100
  • A&B = 1000

5.3.按位或' | '

规则:

如果相应的二进制位有一个为1,则该位的结果就为1(类似逻辑" 或 ")

比如:

  • A = 1010
  • B = 1100
  • A|B = 1110

5.4.按位异或' ^ '

规则:

如果对应的二进制位不同,则该位的数字就为1(两位相同则为0)

比如:

  • A = 1010
  • B = 1100
  • A^B = 0110

5.5.左移' << '

规则:

将二进制码向左移动若干位,后面补0。 (相当于乘以2)

比如:

  • A = 0011
  • A<<1= 0110

5.6.右移' >> '

规则:

将二进制码向右移动若干位,前面补0。 (相当于除以2)

比如:

  • A = 0011
  • A>>1= 0001

6.其他运算符

  • 条件运算符( ? :
  • 逗号运算符( ,
  • 成员运算符( .->
  • 指针运算符( &*

6.1.条件运算符

条件运算符是一个三目运算符,即操作数有三个。

A ? B : C

  • 若表达式A为真,则整条表达式的值为B
  • 若表达式A为假,则整条表达式的值为C

条件运算符可以替代简单的if-else语句。

比如:

int value = (test>1) ? 5 :-5;

上述条件运算符的运用相当于下述代码:

int value;
if (test > 1)
{
    value = 5;
}
else
{
    value = -5;
}

6.2.逗号运算符

整条逗号表达式的值为最后一条表达式的值。

我们使用逗号让一系列运算按顺序执行:

int main ()
{
int a,b; 
a = 5;//初始化a 
b = (a+10,a+5);//初始化b 
cout<<"a = "
	<<a
	<<",b = "
	<<b;
return 0;
}

输出结果为:

a = 5,b = 10

我们由结果可知,最右边的表达式将作为整条逗号表达式的值,其他表达式的值会被丢弃。

如上述代码中,只有a+5有效,而a+10被丢弃(或者说被覆盖了)


6.3.成员运算符

成员运算符包括点运算符'.'和箭头运算符'->'

  • 成员运算符是用于访问结构体,类和共同体的成员的运算符
  • 点运算符直接应用于对象
  • 箭头运算符与指向对象的指针一起使用

比如:

这是一个结构体

struct people
{
  char name[10];
  int age;
}man;

我们要将值"yiyi"赋给对象man的name成员

  • 可以这么做:
strcpy(man.name,"yi");
  • 也可以这样:
//p_man是一个指针,指向类型为people的对象
strcpy(p_man->name,"yi");

6.4.指针运算符

指针运算符有两种:&和*

  • &指针运算符可以返回变量的地址 比如:
int i = 1;
cout << &i;

输出为:

0x6ffe1c
  • *指针运算符可以返回指针所指向的地址(内存)里的值 比如:
int main()
{
int a,b;
int* p_a;
a = 20;
p_a = &a;
b = *p_a;
cout<<"a="<<a<<'\n'
    <<"p_a="<<p_a<<'\n'
    <<"b="<<b;
    return 0;
}

运行结果为:

a=20
p_a=012FFC10
b=20

对自增和自减运算符的一些补充

自增运算符 ++ 会把操作数加 1

自减运算符 -- 会把操作数减 1

a++;//等同于a=a+1;
b--;//等同于b=b-1;
  • 需要注意的是,++(--)可以放在变量的左边或右边。而这两种形式有着很大的区别。

如下所示:

自增.png

输出结果为:

a=5,b=5
a++: 5
++b: 6

很显然,区别在于:

  • 后缀(a++):先完成操作再自增

  • 前缀(++a):先自增再完成操作


好了,运算符的复习就到这,喜欢的朋友点个赞呗。