一、前言
操作符是我们学习C语言算法的必须要掌握的知识。
二、算术操作符
符号 | 用途 | 用法 |
---|---|---|
/ | 取商的操作符 | a/b |
% | 取余数的操作符 | a%b |
注:a、b表示操作数,下同
例如a/b,实际上的结果a除b得到的商。
特别注意:默认是整数,如果想得到浮点型(小数)的结果,那么我们讲a或b任意一个换成浮点型就行。
例如a%b,实际上的结果是a除b得到的余数。
特别注意:%的操作数不能为浮点型的数
三、位移操作符
符号 | 用途 | 用法 |
---|---|---|
<< | 左移(移动的是二进制位) | a<<1 |
>> | 右移(移动的是二进制位) | a>>1 |
特别注意:1.右移分为两种:I.算术右移(常见编译器采用的)右边丢弃,左边补上最高位的符号位
–———————————— II.逻辑右移右边丢弃,左边补0
–———— 2.左移就一种:左边丢弃,右边补0
–———— 3.移动时不能是负数,因为在编译器里面这是未定义的操作
补充:正数的原反补码是一样的;负数的原反补是有自己的规则的,内存里面的存储的是补码,打印函数是打印的数据的原码,判断计算的时候是用的数据的原码,最高位是数据的符号位
例如:10000000000000000000000001——>-1原码
———111111111111111111111111111110——>补码(符号位不变,其他位按位取反)
———111111111111111111111111111111——>反码(在补码的基础上+1)
四、位操作符
符号 | 用途 | 用法 |
---|---|---|
& | 按位与 | a&b |
| | 按位或 | a|b |
^ | 按位异或 | a^b |
注:这里的位都是二进制位,且它们的操作数必须是整数
&与:两个都为1,才能为1
|或:一个为1,就能得到1
^异或:相同为0;不同为1
例如:
int a=3;//00000000000000000000000000000011
int b=5;//00000000000000000000000000000101
a&b;// 00000000000000000000000000000001
a|b;// 00000000000000000000000000000111
a^b;// 00000000000000000000000000000110
五、赋值操作符
符号 | 用途 | 用法 |
---|---|---|
= | 赋值 | a=1 |
特别注意记得区分“=”与“==”
六、复合操作符
符号 | 用途 | 用法 |
---|---|---|
+= | 加等 | a+=1 |
-= | 减等 | a-=1 |
*= | 乘等 | a*=1 |
/= | 商等 | a/=1 |
%= | 余等 | a%=1 |
我们可以根据等价形式理解
a+=1等价于下列代码
a=a+1;
七、单目操作符
单目操作符:只有一个操作数的
符号 | 用途 | 用法 |
---|---|---|
! | 取反 | !0 |
- | 负数 | -1 |
+ | 正数 | +1 |
& | 取地址操作符 | &a |
* | 解引用操作符 | *pa |
sizeof | 求数据的大小 | sizeof(a) |
++/- - | 加法减法 | a++/++a |
() | 强制类型转换 | (int)a |
~ | 按位取反 | ~0 |
注意:sizeof计算变量的大小
1.sizeof可以根据变量名计算例如sizeof(a),也可以用数据类型计算sizeof(int)进行计算
2.还可以省略括号,sizeof(a)等价于sizeof a,但是sizeof int是不行的
3.还有一个特别的,变量int arr[10]={0};用sizeof(arr)可以计算,利用数据类型的时候是sizeof(int [10])。
==sizeof(表达式),表达式时不直接运算的(sizeof里面的表达式不会对变量进行修改)
例如:
short s=0;
int a=0;
printf("%d",sizeof(s=a+5));里面关于s的表达式,出了这条语句没用
printf("%d",s);//此时s仍然是0
注意:++/- -;
前置++/- -,后使用
后置先使用,后++/- -
注意
八、关系操作符
这一类操作符都是判断相不相等与比较大小
符号 | 用途 | 用法 |
---|---|---|
== | 判断相等 | a==1 |
!= | 判断不等 | a!=1 |
<= | 小于等于 | a<=1 |
>= | 大于等于 | a>=1 |
< | 小于 | a<1 |
> | 大于 | a>1 |
九、逻辑操作符
符号 | 用途 | 用法 |
---|---|---|
&& | 逻辑与 | a&&b |
|| | 逻辑或 | a||b |
计算的特点:
&&左边算的结果是假,右边直接不用算了
||的特点和&&是互补的:所以||左边的算出来是真,右边不用算了
代码如下:
i=a++&&b++&&++c&&d++;
i=a++||b++||++c||d++;
十、条件操作符(三目操作符)
符号 | 用途 | 用法 |
---|---|---|
? : | 判断条件 | exp1?exp2:exp3 |
用等价的方法理解
a>b?a:b;
等价于
if(a>b)
a;
else
b;
十一、逗号表达式
符号 | 用途 | 用法 |
---|---|---|
,,, | 逗号隔开多个表达式,从左向右一次执行,整个表达式结果是最后一个表达式的结果 | exp1,epx2,exp3,…expN |
十二、下标引用操作符、函数调用、结构成员
符号 | 用途 | 用法 |
---|---|---|
[] | 数组的下标[1] | |
() | 函数调用 | game() |
. | 结构体访问 | 结构体变量名.成员名 |
-> | 结构体访问 | 结构体指针名->成员名 |
注意
[]:下标引用操作符,有两个操作数。
举例认识;arr[5]=10;此时一个操作数是arr数组宁外一个是10索引值
():函数调用操作符,并非所有的()都是函数调用操作符
区分两个:
int main(int x,int y)//此时是函数定义的语法规则
int max=get_max(a,b)//这个才是函数调用操作符
补充结构体:
1.'.‘在结构体里面访问成员,上述代码中是s1.age
2.’->'在结构体里面访问成员,上述代码中是ps->age