大家好,今天我们来学习C语言中的操作符。
首先让我们看看操作符的种类。
操作符分类:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
算数操作符:
一、“/”除号操作符
只有除法操作中两边是整数,才会执行整数除法,除法操作中,如果两边有一边有浮点数,才执行浮点数除法。除法的进行与操作数的类型无关。
【看到如下代码】
#include<stdio.h>
int main()
{
int ret1 = 9 / 2;
double ret2 = 9 / 2;
double ret3 = 9 / 2.0;
printf("%d\n", ret1);
printf("%lf\n", ret2);
printf("%lf\n", ret3);
return 0;
}
看到程序运行的结果,我们发现两边的数字有浮点型时,才执行浮点型除法。
二、“%”取余操作符,顾名思义就是取余数。
【看到代码】
#include<stdio.h>
int main()
{
int a = 9 % 2;
printf("%d", a);
}
因为九除二的结果余数为一,所以运行的结果就为一。
三、算数操作符还包括“*”乘法操作符和“+”“-”加减法操作符,这几个操作符比较简单,想必大家都了解,所以就不进行讲解了。
算数操作符还有几点要注意的是:
- 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
- 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
- % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
移位操作符:
<< 左移操作符 >> 右移操作符
注:移位操作符的操作数只能是整数。
我们在进行移位操作符的时候要注意我们进行的是二进制的移位,什么意思呢,因为我们的是整数,整数有四个字节,三十二个比特位,这三十二个比特位都是二进制的,这三十二个比特位成为这个数的原码,在最前面的这个二进制位为符号位,0表示正,1表示负。如1的原码00000000000000000000000000000001,-1的原码为10000000000000000000000000000001,因为我们进行操作符运算的时候是对它的补码进行运算,所以我们还有将原码转化为补码。这里我们要注意的是正整数的反码和补码就是它的原码,而负数整的补码要先将它转化为反码,要想将它转化为反码,只需符号位不变,其他位按位取反,补码就是反码在加上1。看到下面的代码:
//a=-5
//原码 10000000000000000000000000000101
//反码 11111111111111111111111111111010
//补码 11111111111111111111111111111011
我们已经知道操作符是对它的补码进行操作,接下来就是让我们明白移位操作符的规则:
左移操作符:左边抛弃、右边补0
右移操作符:
- 逻辑移位左边用0填充,右边丢弃
- 算术移位左边用原该值的符号位填充,右边丢弃
接下来让我们看到代码:
int main()
{
int a = 5;
int b = a << 1;
// a的补码 00000000000000000000000000000101
//左移移位 00000000000000000000000000001010
printf("%d\n", b);
printf("%d\n", a);
return 0;
}
因为是二进制,b的值等于2的三次方加上2的一次方等于是10,但是a本身没有变化。
int main()
{
int a = -5;
int b = a >> 1;
//a的原码 10000000000000000000000000000101
// 反码 11111111111111111111111111111010
// 补码 11111111111111111111111111111011
//右移一位 01111111111111111111111111111101 或者11111111111111111111111111111101
printf("%d\n", b);
printf("%d\n", a);
return 0;
}
我们可以看到打印出来的结果是-3,虽然我们有两种移位方式,但是我们的编译器用的是算数移位。
注:对于移位运算符,不要移动负数位,这个是标准未定义的。
位操作符:
& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。
1.& 按位于操作符
&:全是1为1,有0为0
代码如下:
int main()
{
int a = 3;
int b = -2;
int c = a & b;
//a的补码 00000000000000000000000000000011
//b的原码 10000000000000000000000000000010
//b的反码 11111111111111111111111111111101
//b的补码 11111111111111111111111111111110
//根据全1为1的原则
//得到c的补码为00000000000000000000000000000010=2
printf("%d", c);
return 0;
}
2.| 按位或
|:有1为1,全0为0
【看到如下代码】:
int main()
{
int a = 3;
int b = -2;
int c = a | b;
//a的补码 00000000000000000000000000000011
//b的原码 10000000000000000000000000000010
//b的反码 11111111111111111111111111111101
//b的补码 11111111111111111111111111111110
//根据全1为1的原则
//得到c的补码为 11111111111111111111111111111111
//得到c的反码为 11111111111111111111111111111110
//得到c的原码为 10000000000000000000000000000001=-1
printf("%d", c);
return 0;
}
在这里我们要注意通过位操作符得到的补码如果符号位为0,那么它的原码就是补码,如果它的符号位为一,那么就得先减一得到反码,在符号位不变按位取反得到原码,计算出结果。或者再次符号位不变按位取反在加上一也可以得到原码。
3.^按位异或
^:相同为0,不同为1
代码如下:
int main()
{
int a = 3;
int b = -2;
int c = a ^ b;
//a的补码 00000000000000000000000000000011
//b的原码 10000000000000000000000000000010
//b的反码 11111111111111111111111111111101
//b的补码 11111111111111111111111111111110
//根据全1为1的原则
//得到c的补码为 11111111111111111111111111111101
//得到c的反码为 11111111111111111111111111111100
//得到c的原码为 10000000000000000000000000000011=-3
printf("%d", c);
return 0;
}
赋值操作符
例如:
int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值
还有复合赋值符:
例如:
+= <<=
-= >>=
/= *=
举个例子:
int x = 10;
x = x+10;
x += 10;//复合赋值
这是第一小节的内容,谢谢大家。