【一篇文章带你重温重点】C语言操作符

【一篇文章带你重温重点】C语言操作符_第1张图片

  • 文章目录
    • 算术操作符
    • 移位操作符
    • 位操作符
    • 赋值操作符
    • 单目操作符
    • 关系操作符
    • 逻辑操作符

算术操作符

加( + ) 减( - )乘( * )除( / ) 取模( % )

算术操作符是我们日常用的最多的,也是大家最熟悉不过的。

要注意以下几点

1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。

2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。

3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

典型错误
【一篇文章带你重温重点】C语言操作符_第2张图片


移位操作符

移位操作符分左移和右移

<< 左移操作符
>> 右移操作符

_
注:移位操作符的操作数只能是整数。而且是针对二进制补码进行移动

1.左移操作符

它的移位规则:

左边抛弃、右边补0

【一篇文章带你重温重点】C语言操作符_第3张图片


2.右移操作符

移位规则:

首先右移运算分两种:

1. 逻辑移位
左边用0填充,右边丢弃

2. 算术移位
左边用原该值的符号位填充,右边丢弃

那计算机采用的是逻辑移位,还是算术移位呢???
正确答案是取决于编译器,不过大部分编译器的是采用算术移位,因为这样意义才大!!

先补充一些计算机存储数据的知识

在计算机中存储数据是按二进制的补码进行存储的
补码的转换公式=原码取反加一!
正数的原码反码补码是一样的!!!!!!

假设编译器是逻辑移位
【一篇文章带你重温重点】C语言操作符_第4张图片


正数右移

【一篇文章带你重温重点】C语言操作符_第5张图片


负数右移

【一篇文章带你重温重点】C语言操作符_第6张图片

所以说,只有当右移位算术移位才有实际意义,比如我们上面把-4右移,其实就是让它除2,变成-2,而逻辑右移则将这个数变成一个非常大的正数,那它的意义何在呢?

位操作符

位操作符有:

& -------- 按位与
| --------- 按位或
^ -------- 按位异或
注:他们的操作数必须是整数。

通过一些练习题来理解它是最好不过的方法!

#include 
int main()
{
	int num1 = 1;
	int num2 = 2;
	int a=num1& num2;
	int b=num1 | num2;
	int c=num1^ num2;

	printf("a=%d  b=%d  c=%d", a, c, b);

	return 0;
}

上面结果:a=0,b=3,c=3
解释如下
【一篇文章带你重温重点】C语言操作符_第7张图片

有个小结论:任何数与0异或等于任何数,比如10^0=10
任何数与自己异或等于0,比如10^10=0
而且它们满足交换律,比如10^ 4 ^ 10= 10^ 10 ^4=0 ^ 4=4

至于为什么是这样,其实跟上面图的num1^num2一样的分析方法,自己可以尝试画一下图理解,有了这个结论就可以做一下下面这道面试题

曾经有一道变态面试

不能创建临时变量(第三个变量),实现两个数的交换。
【一篇文章带你重温重点】C语言操作符_第8张图片

#include 
int main()
{
	int a = 10;
	int b = 20;
	printf("交换前a = %d b = %d\n", a, b);//
	a = a ^ b;	// 其实就是a=10^20,先不用算结果
	b = a ^ b;	//然后现在b=a^b=10^20^20,所以就变成b=10^0=10

	a = a ^ b;	//这里就是a= 10 ^ 20 ^ b = 10 ^ 20 ^ 10
				//用交换律就等于10 ^ 10 ^ 20 = 0 ^ 20 = 20
	printf("交换后a = %d b = %d\n", a, b);//这样两个数就交换过来了
	

	return 0;
}

赋值操作符

赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。

我们创建变量并赋值叫初始化,而后面才叫赋值
【一篇文章带你重温重点】C语言操作符_第9张图片


复合赋值符

+=
–=
*=
/=
%=
>>=
<<=
&=
|=
^=

上面的都像下图一样等价比如a*=2 等价于a=a*2
【一篇文章带你重温重点】C语言操作符_第10张图片


单目操作符

! ------------ 逻辑反操作
- ------------ 负值
+ ----------- 正值
& ------------取地址
sizeof ------操作数的类型长度(以字节为单位)
~ ------------ 对一个数的二进制按位取反
------------前置、后置–
++ ----------前置、后置++
* ------------ 间接访问操作符(解引用操作符)
(类型) ------ 强制类型转换

主要要注意的是前置和后置的区别

【一篇文章带你重温重点】C语言操作符_第11张图片


关系操作符

>
>=
<
<=
!= ----------- 用于测试“不相等”
== ---------- 用于测试“相等”

关系操作符比较简单,最主要的就是下面这个
警告:
在编程的过程中== 和=不小心写错,导致的错误

【一篇文章带你重温重点】C语言操作符_第12张图片


逻辑操作符

&& ------------ 逻辑与
|| --------------- 逻辑或

注意:
区分逻辑与和按位与
区分逻辑或和按位或

1&2----->0--------按位与


1&&2---->1-------逻辑与 两边的数为真,表达式就为真


1|2----->3---------按位或


1||2---->1----------逻辑或 其中一方为真,则表达式为真

逻辑操作符常常用于条件判断语句,比如想判断一个是是否大于100,并且小于200
【一篇文章带你重温重点】C语言操作符_第13张图片

逻辑操作符还有一个最重要的点就是‘“短路”
用一道题理解

一道360笔试题

#include 
int main()
{
    int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0;
}
//程序输出的结果是什么?

a=1,b=2,c=3,d=4
根据短路原则,只有a++运算了,其余没有进行运算
【一篇文章带你重温重点】C语言操作符_第14张图片

你可能感兴趣的:(C语言系列,c语言,开发语言,visual,studio,后端)