前言
前面我们对C语言的一维数组、二维数组的有了一定的了解,今天带大家了解C语言中的操作符。
我们先来看看操作符都有那些>
操作符分类
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
下标引用、函数调用和结构成员
我们来逐个探讨探讨>
操作符详解
算术操作符
+ - * / %
- 除了
%
操作符之外,其他的几个操作符可以作用于整数和浮点数。 - 对于
/
操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。 %
操作符的两个操作数必须为整数。返回的是整除之后的余数。
我们来用代码演示一下>
#include<stdio.h> int main() { //+ - * / % int a = 4; int b = 2; printf("%d\n", a + b); printf("%d\n", a - b); printf("%d\n", a * b); printf("%d\n", a / b); printf("%d\n", a % b); return 0; }
移位操作符
移(2进制)位操作符(整数)
<<
左移操作符
>>
右移操作符注:移位操作符的操作数只能是整数。
补充>
2进制:
整数的2进制表示形式,其实有三种
原码
反码
补码
内存中存储的其实是:补码的二进制
所以在参与移位的时候,移动的都是补码
eg:
12-数值
2进制:1100
8进制:14
10进制:12
16进制:c
int main() { //按照一个属的正负,直接写出它的二进制表示形式得到的就是原码 //正数 //正数的原码、反码、补码是相同的 //负数的原码、反码、补码要经过计算 //反码是符号位不变,其他未按位取反,就是反码 // 补码是反码+1 //整形占4个字节(32bit) //00000000000000000000000000001010-原码 //00000000000000000000000000001010-反码 //00000000000000000000000000001010-补码 int a = 10; //10000000000000000000000000001010-原码 //11111111111111111111111111110101-反码 //11111111111111111111111111110110-补码 int b = -10; return 0; }
原、反、补的计算方法
左移操作符
移位规则:
左边抛弃、右边补0
int main() { int a = 10; int b = a << 1; //00000000000000000000000000001010-补码 printf("%d\n", b); printf("%d\n", a); return 0; }
再举一个负数的案例
int main() { int a = -10; //10000000000000000000000000001010 //11111111111111111111111111110101 //11111111111111111111111111110110-补码 int b = a << 1; printf("b=%d\n", b);//-20 printf("a=%d\n", a);//-10 return 0; }
我们可以发现左移一次反有一个*2
的效果。
右移操作符
移位规则:
首先右移运算分两种:
- 逻辑移位
左边用0填充,右边丢弃- 算术移位 (平常见到)
左边用原该值的符号位填充,右边丢弃
int main() { int a = -1; //10000000000000000000000000000001 //11111111111111111111111111111110 //11111111111111111111111111111111 int b = a >> 1; printf("b=%d\n", b); printf("a=%d\n", a); return 0; }
那在编译器中到底是算术右移还是逻辑右移呢,两者区别是左边补的符号位不同,假如结果跟原来的符号相同,那么就是算术右移,反之就是逻辑右移。
我们来看看运行结果>
很显然在我们vs编译器中是算术右移。
警告⚠
:
对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:
int num = 10; num>>-1;//error
位操作符
位操作符有:
& //按位与 | //按位或 ^ //按位异或 //注:他们的操作数必须是整数。
这些操作符也是对二进制进行操作的
&
操作符
int main() { int a = 3; //00000000000000000000000000000011 int b = -5; //10000000000000000000000000000101 //11111111111111111111111111111010 //11111111111111111111111111111011-补码 int c = a & b; //00000000000000000000000000000011 //11111111111111111111111111111011 //00000000000000000000000000000011 printf("%d\n", c);//3 return 0; }
|
操作符
int main() { int a = 3; //00000000000000000000000000000011 int b = -5; //10000000000000000000000000000101 //11111111111111111111111111111010 //11111111111111111111111111111011-补码 int c = a | b; //00000000000000000000000000000011 //11111111111111111111111111111011 //11111111111111111111111111111011 printf("%d\n", c);//-5 return 0; }
对应的二进制位有1则为1,两个同时为0则为0
^
操作符
//对应的二进制位:相同为0,相异为1 int main() { int a = 3; //00000000000000000000000000000011 int b = -5; //10000000000000000000000000000101 //11111111111111111111111111111010 //11111111111111111111111111111011-补码 int c = a ^ b; //00000000000000000000000000000011 //11111111111111111111111111111011 //11111111111111111111111111111000 printf("%d\n", c);//-8 return 0; }
对应的二进制位:相同为0,相异为1
赋值操作符
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
int weight = 120;//体重 weight = 89;//不满意就赋值 double salary = 10000.0; salary = 20000.0;//使用赋值操作符赋值。 赋值操作符可以连续使用,比如: int a = 10; int x = 0; int y = 20; a = x = y+1;//连续赋值 这样的代码感觉怎么样? 那同样的语义,你看看: x = y+1; a = x; 这样的写法是不是更加清晰爽朗而且易于调试。
复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
这些运算符都可以写成复合的效果。
比如:
int x = 10; x = x+10; x += 10;//复合赋值 //其他运算符一样的道理。这样写更加简洁。
小结
今天我们学习了算术操作符、移位操作符、位操作符、赋值操作符,相信大家看完有一定的收获。
种一棵树的最好时间是十年前,其次是现在! 把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!创作不易,辛苦各位小伙伴们动动小手,三连一波~~~,本文中也有不足之处,欢迎各位随时私信点评指正!