C语言——操作符(上)

发布于:2022-11-16 ⋅ 阅读:(892) ⋅ 点赞:(0)

目录

导语及思维导图:

1、算数操作符 

2、移位操作符

3、位操作符

3.1 & 

3.2  |

3.3  ^

4、赋值操作符

5、单目操作符

5.1单目操作符介绍

结语:


导语及思维导图:

在C语言里面,有许许多多的操作符,功能丰富。下面将为大家讲解一部分操作符的功能及用法,让我们拭目以待吧。

思维导图:

 

1、算数操作符 

+  -  *  / %

对于操作符,其实我们可以理解为运算符

int main()
{
	int a = 5;
	int b = 3;
	int sum = a + b;       //加
	int diff = a - b;      //减
	int mul = a * b;       //乘
	int divide = a / b;    //除
	int remainder = a % b; //取模(两端只能是整数)
	printf("sum = %d\n", sum);
	printf("diff = %d\n", diff);
	printf("mul = %d\n", mul);
	printf("divide = %d\n", divide);
	printf("remainder = %d\n", remainder);
	return 0;
}

运行结果: 

 

这里我们讲一下 /(除法) 操作符

对于除法操作符:

①两边的操作符都是整数,那执行的是整数除法;

②如果要计算小数,那么除号两端至少有一个是浮点数

int main()
{
	int divide1 = 5 / 3;
	double divide2 = 5.0 / 3;
	printf("divide1 = %d\n", divide1);
	printf("divide2 = %lf\n", divide2);
	return 0;
}

运行结果:

2、移位操作符

<<左移操作符

>>右移操作符

注:移位操作符只能操作整数

移位操作符,移的其实是二进制位

int main()
{
	int a = 15;
	printf("%d\n", a >> 2);//右移2位
	printf("%d\n", a << 2);//左移2位
	return 0;
}

运行结果: 

 在我们了解移位之前,我们先要了解二进制在计算机中是如何存储的

二进制表示形式:

原码

反码

补码

正数的原码、反码、补码都是相同的,我们以15为例:

 

负数的原码、反码、补码要经过计算,以-15为例:

 

 

在计算机中,是以二进制的反码形式存储的

所以参与移位的时候,移动的都是补码。

有了这个知识储备,那我们来看是如何位移的(负数为例)

int main()
{
	int a = -15;
	printf("%d\n", a >> 2);//右移2位
	printf("%d\n", a << 2);//左移2位
	return 0;
}

 

警告⚠ : 对于移位运算符,不要移动负数位,这个是标准未定义的

3、位操作符

位操作符:

&   按位与

 |   按位或

^   按位异或

注:他们操作的数必须为整数(也是针对二进制的)

3.1 & 

& 按位与 ,全真为真,有假则假 

int main()
{
	//& 全真为真,有假则假
	int a = 5;
	//00000000000000000000000000000101
	int b = -2;
	//原码:10000000000000000000000000000010
	//补码:11111111111111111111111111111110
	int c = a & b;
	//00000000000000000000000000000101
	// &
	//11111111111111111111111111111110
	//00000000000000000000000000000100
	printf("c = %d", c);
	return 0;
}
输出:
c = 4

3.2  |

|  按位或,有真为真,全假为假

int main()
{
	// | 有真则真,全假则假
	int a = 5;
	//00000000000000000000000000000101
	int b = -2;
	//原码:10000000000000000000000000000010
	//补码:11111111111111111111111111111110
	int c = a | b;
	//00000000000000000000000000000101
	// |
	//11111111111111111111111111111110
	//补码:11111111111111111111111111111111
	//原码:10000000000000000000000000000001
	printf("c = %d", c);
	return 0;
}
输出:
c = -1

 3.3  ^

 ^ 按位异或,相同为0,相异为1

int main()
{
	// ^ 相同为0,相异为1
	int a = 5;
	//00000000000000000000000000000101
	int b = -2;
	//原码:10000000000000000000000000000010
	//补码:11111111111111111111111111111110
	int c = a ^ b;
	//00000000000000000000000000000101
	// ^	
	//11111111111111111111111111111110
	//补码:11111111111111111111111111111011
	//原码:10000000000000000000000000000101
	printf("c = %d", c);
	return 0;
}
输出:
c = -5

 举例:

有一道面试编程题:

如果通过不创建临时变量,交换两个数的值

int main()
{
	int a = 12;
	int b = 21;
	printf("a = %d b = %d\n", a, b);
	a = a ^ b;
	b = a ^ b; // b = (a ^ b) ^ b = a
	a = a ^ b; // a = a ^ (a ^ b) = b
	printf("a = %d b = %d\n", a, b);
	return 0;
}

 异或操作符:

①a ^ a = 0;

②0 ^ a = 0;

③异或是支持交换律的。

4、赋值操作符

赋值操作符就是字面意思,给变量赋值

复合赋值符

+=

-=

*=   

/=

%=

>>=

<<=

&=

|=

^=

int main()
{
	int a;//未初始化
	int b;
	a = 10;// = 赋值
	b = 6;
	int c = 0;
	c += b; // c = c + b;
	return 0;
}

5、单目操作符

5.1单目操作符介绍

!           逻辑反操作

-           负值

+           正值

&           取地址

sizeof      操作数的类型长度(以字节为单位)

~           对一个数的二进制按位取反

--          前置、后置--

++          前置、后置++

*           间接访问操作符(解引用操作符)

(类型)       强制类型转

!  逻辑反操作

C语言里面,0为假,非0为真

反操作符就是 将真变为假,将假变为真

 - +正负操作符

很好理解,数学里面的正负

 & 取地址操作符

这个我们之前在将指针的文章见到过,就是将变量的地址取出来,可以通过地址去访问该变量

sizeof 操作数的类型长度

sizeof也是老朋友了,sizeof要记得是一个操作符

int main()
{
	int a = 0;
	char c = 'a';
	int arr[5] = { 1,2,3,4,5 };
	printf("%zd\n", sizeof(a));
	printf("%zd\n", sizeof a); // 括号可以省略,证明sizeof不是函数
	printf("%zd\n", sizeof(c));
	printf("%zd\n", sizeof(arr)); //数组大小为5,整型 5 * 4 = 20
	printf("%zd\n", sizeof(arr[0])); //该表为0的一个元素
	return 0;
}
输出:
4
4
1
20
4

sizeof补充

 

~ 对一个二进制(补码)数按位取反 

int main()
{
	int a = 0;
	printf("%d",~a);
	return 0;
}
输出:
-1

前置、后置  ++ --

这个初学者容易混淆,但其实很好理解

++(--)在前面,那么就先计算,再给值(先吃饭,再给钱);

++(--)在后面,那么就先先给值,再计算(先给钱,再吃饭)

int main()
{
	int a1 = 0;
	int a2 = 0;
	int b = 0;
	int c = 0;
	b = a1++; //先把值赋给b ,然后a再自增
	c = ++a2; //a先自增,然后再把值赋给b
	printf("b = %d\n", b);
	printf("c = %d\n", c);
	return 0;
}
输出:
b = 0
c = 1

* 解引用操作符

这个在指针也见过,对取地址的解引用

可理解为:找到了门牌号,但没有钥匙,无法进入房间, * 就相当于钥匙

int main()
{
	int a = 3;
	int* pa = &a;
	printf("%p\n", pa);
	printf("%d\n", *pa);//对pa解引用,访问a的值
	return 0;
}

 (类型)  强制类型转换

这是一个强扭的瓜,不是很建议使用

int main()
{
	int a = (int)3.14;
	printf("%d\n", a);
	return 0;
}
输出:
3

结语:

  本篇文字讲了一部分的操作符功能及用法,本篇文章,需弄清楚,sizeof是一个操作符、前置(后置)++(--)的用法。如果本篇文字对大家有帮助,不妨点个赞支持下,下期会完善操作符的讲解。
  好了,下机,再见!


网站公告

今日签到

点亮在社区的每一天
去签到