初识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.
有三个运算法则有必要给大家补充:
- a^a=0;
- a^0=a;
- 异或支持交换律;
下面有一个题目:不能创建临时变量,实现两个数的交换;(大家可以自行尝试一下)
#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;
}