初识C语言——操作符详解

一、算数操作符(+、-、*、/)

1.对于算数操作符大家要注意的是%只能作用于整数,并且结果的符号跟被除数的符号保持一致;
例如:7%5=2;-7%5=-2;7%-5=2;-7%-5=-2;
2.除了%以外,其他算数操作符的操作数中只要有一个浮点数,那么就执行浮点数除法

二、移位操作符(<<、>>)

1. << 左移操作符

首先要知道,移位操作符只针对于整数使用,并且是对于补码在进行操作,因为整数在计算机的内存当中是以补码的形式存放的。
首先我以正数为例,针对下面一段代码我们能得出,对于一个整数的位移操作并不会改变这个数本身,a原本等于10,移位之后仍然为10,只不过是把移位以后的效果赋给了b;在代码的下面我会详细为大家演示移位到底是怎么样进行的。

#include <stdio.h>
int main()
{
	int a = 10;
	int b = a << 1;
	printf("%d\n", b);//运行结果为20
	printf("%d\n", a);//运行结果为10
	return 0;
}

在这里插入图片描述

其实我们不难发现,左移其实就是给原来的数乘以2的n次方(假设n是移位数)

下面我为大家举例负数左移;同样我为大家奉上详细过程;

#include <stdio.h>
int main()
{
	int a = -10;
	int b = a << 1;
	printf("%d\n", b);//-20
	printf("%d\n", a);//-10
	return 0;
}

在这里插入图片描述

2. >> 右移操作符

与左移操作符不一样的是,右移操作符分为逻辑右移和算数右移.
逻辑右移用0补位,而算数右移用该数的符号位补位
演示如下:

在这里插入图片描述

三、位操作符(& | ^)-----它们的操作数必须是整数,且都是对于补码在进行操作

对于位操作符大家只要知道运算法则就行了,不给大家一一演示了

1. & 按位与

相同位数字都为1则结果为1,只要有一个为0则结果为0.

2. | 按位或

相同位数字只要有一个为1则结果为1,只有相同位都为0时结果才为0.

3. ^ 按位异或

可用于实现简单的数据交换,相同位相同则结果为0,相同位不同则结果为1.

有三个运算法则有必要给大家补充:

  1. a^a=0;
  2. a^0=a;
  3. 异或支持交换律;

下面有一个题目:不能创建临时变量,实现两个数的交换;(大家可以自行尝试一下)

#include <stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	printf("交换前a = %d,b = %d\n", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("交换后a = %d,b = %d\n", a, b);
	return 0;
}

4.布尔类型

布尔类型就是用来表示真假的类型,需要引用头文件stdbool.h

#include <stdio.h>
#include <stdbool.h>
int main()
{
	_Bool flag = false;
	if (flag == false)
		printf("hello\n");
	return 0;
}

四.单目操作符

这里我们着重介绍几个,便不再一一例举

1.& 取地址操作符

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	printf("%p\n", arr);//数组名是数组中首元素地址
	printf("%d\n", *arr);//解引用我们打印出arr所对应的元素显然是首元素

	printf("%d\n", &arr[0]);//这里我们利用下标取出了首元素地址
	printf("--------------------\n");
	//特别要注意的一点其实是
	printf("%p\n", &arr);//这里取出的是数组的地址
	printf("%p\n", &arr + 1);//+1之间跳过了整个数组
	printf("--------------------\n");
	printf("%p\n", arr);
	printf("%p\n", arr + 1);
	printf("%d\n", *(arr + 1));


	return 0;
}

在这里插入图片描述

其实在这里呢给大家演示了如何取地址,但重点是想让大家明白arr和&arr是完全不一样的.
arr只是代表首元素地址,而&arr代表的是整个数组的地址,即使它们两个都只是指向首元素的地址

2.sizeof–它既是操作符也是关键字

sizeof是用来计算变量(类型)所占空间的大小的
需要强调的是

sizeof()若计算一个表达式所占空间的大小,那么它不会执行这个表达式,而是在编译的时候已经确定了表达式的大小,下面举一个例子

#include <stdio.h>
int main()
{
	int a = 3;
	short s = 10;
	printf("%d\n", sizeof(s = a + 10));
	printf("s = %d\n", s);
	return 0;
}

在这里插入图片描述

显而易见,在上述代码中sizeof并没有对表达式计算

还有较为重要的一点,在数组传参时应当在主函数里面计算数组大小,再将计算好的大小传给形参;而不是在所调用的函数里面计算数组大小

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

#include <stdio.h>
int main()
{
	int a = 0;
	//0的二进制位00000000000000000000000000000000
	//~a:       11111111111111111111111111111111
	//-1取反+1: 10000000000000000000000000000001=-1
	printf("%d\n", ~a);//结果为-1
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值