目录
学习c语言的你,是否还在为各种各样的操作符苦恼?
分类
C语言中的操作符有:
算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式
算术操作符:+、-、* 、/、%
想必+、-、* 这三个运算符大家都很熟悉,但 / 和% 却与我们生活中的除法和求余有着一些差别:
m/n结果为m除以n的商,取整数(并不等于2.5)。m%n结果为m除以n的余数,求余数也叫取模。
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
移位操作符
分为:
<< 左移操作符
>>右移操作符
1、 左移操作符 移位规则:
左边抛弃、右边补0
2、 右移操作符 移位规则:
首先右移运算分两种:
1. 逻辑移位 左边用0填充,右边丢弃
2. 算术移位 左边用原该值的符号位填充,右边丢弃
警告 : 对于移位运算符,不要移动负数位,这个是标准未定义的。
其实数字在电脑中是以二进制方式储存的,而int型的大小为4个字节,也就是32个比特位,位移操作,顾名思义,就是操作它的二进制位。
在这里简单介绍下原码、反码、补码,在计算机中储存整数,不论正负,都是按照补码的形式放到储存单元里面,因此运算实际上是补码的运算。
正数的原码、反码、补码都是它的二进制位,而负数要考虑符号位 ,负数的补码等于反码+1,
求一个负数的补码,先求得其绝对值下的原码,对原码逐位取反(0取1,1变0),得到反码,再反码+1得到补码。
列如:
位操作符
位操作符有:
& 按位与(有0出0)
| 按位或(有1出1)
^ 按位异或(相同为0,相异为1)
注:他们的操作数必须是整数,同样操作他们的补码。
列如:按位与
按位或
按位异或
赋值操作符(=)
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。注意要和(==)区别开来
复合赋值符
+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=
其他操作符一样的道理,这样做是为了让表达式更加简洁。
单目操作符
单目操作符有哪些呢?
单目操作符,顾名思义,其操作数只有一个,重点讲一讲sizeof、++、--、*
sizeof(求操作数的类型长度):
int a = 10;
printf("%d\n",sizeof(a)); //结果为4(字节)
printf("%d\n",sizeof(int)); //结果为4(字节)
printf("%d\n",sizeof a); //结果为4(字节) 求变量的长度时可以省略括号
printf("%d\n",sizeof int); //错误,求类型的长度时不能去掉括号
自增自减操作符:
++i,--i //在使用i之前,先使得i的值增加、减少
i++,i-- // 在使用i之后,再使得i的值增加、减少
列如:
int i=3;
j=++i; //(先使i的值变成4,再赋值给j,j的值为4)
j=i++; //(先将i的值赋给j,j的值为3,然后i再变为4)
解引用操作(*)
*和数学上的乘号长相一样,但是在这里意义不同
例如:
int a = 5;
int *pa = &a;
*pa = 100; //解引用
(类型)(强制类型转化)
srand((unsigned int)time(NULL));
关系操作符
关系操作符有:> 、>= 、< 、<= 、!= (不等于) 、== (等于)
注意区分 =(赋值)和==(等于)
逻辑操作符
逻辑操作符有哪些: && ||
注意区分:逻辑与、逻辑或和按位与、按位或
&& // 逻辑与
|| //逻辑或
1&2----->0
1&&2---->1
1|2----->3
1||2---->1
条件操作符
a>b?a:b // a与b比较,大者取a,否则取b
逗号表达式
注意:逗号表达式的结果虽然是最后一个表达式的结果,但不可认为与前面的表达式就无关了,因为前面表达式可能会影响最后一个表达式的结果。