目录: 一操作符定义 二操作符分类 三详解操作符 四逗号表达式 五. 下标引用、函数调用和结构成员 六 隐式类型转换整型提升
一 .定义:
指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。不同的指令用操作符这个字段的不同编码来表示,每一种编码代表一种指令。(操作符_百度百科 (baidu.com))
二.分类:
1.算术操作符 2.移位操作符 3.位操作符 4.赋值操作符 5.单目操作符 6.关系操作符 7.逻辑操作符 8.条件操作符 9三目操作符;
三.详解:
1.算术操作符 :+ - * / %(取余数);
(1) 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
(2) 对于 / 操作符如果两个操作数都为整数,执行整数除法(剩下的除不尽的只会去掉)。而只要有浮点数执行的就是浮点数除法。
(3) % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
2.位移操作符: <<(左移操作符,默认一位可以更改) >>(右移操作符,默认一位可以更改 分为算数位移,逻辑位移 );(注意只能用于整数)(警告⚠ : 对于移位运算符,不要移动负数位,这个是标准未定义的。)
理解(建议先看补充再看理解):
左移或者右移指的是移动该变量二进制形式(电脑只会识别记住二进制数据);
左移就是该数据的二进制序列向左移动,后面的空位补充0;
右移就是该数据的二进制序列向右移动,前面面的空位补充符号位数字(这是逻辑位移) 算数位移则是补充0(算数位移默认正数);
使用:
a本身不会发生变化,除非你再次给a赋值;
补充: (1)因为电脑只会识别记住二进制数据,so只有0 1 ,同时0代表假,1代表真。
(2)在二进制数据首位的是符号位,符号位中0代表正数,1代表负数 。
(3)系统一般默认为有符号位(signed)的即二进制首字符有0 1之分,可用(unsigned)表示无符号位即为二进制首字符为0确定的
(4)数据二进制的长度取决于它属于的数据类型。
(5)计算数据类型化成二进制的长度方法:8 乘以 字节总数;
(6)把二进制化成十进制方法:举例子讲解,x进制的次方从0开始,数字最大值=x(进制)-1;八进制(ddd),和16进制(xdd)同理;
例子:00000001:代表的是char类型的变量,值为1;
1000000000000111:代表的是short类型的变量,值为-(1*2^2+2^1*1+2^0*1)=-7
00000000000000000000000000000010代表的是int或者long或者float类型的变量,值为(2^1*1+2^0*0)=2 或者2 或者2.000...;
同时可知char最大是128(有符号位的是这样),剩下还有负数。
公式是有符号位的2^(n个字节-1);否则不能用出错。
但是对于无符号位的:
(7)当输入数据并储存于a变量时,数据会自动改变成二进制,但是输入的是原码,但是他还会转化成反码,最后转化成补码并储存。
原码---(符号位不变其他位,按位取反)-->反码---(加1)--->补码
例子:11原码:00000000000000000000000000001011;
反码:11111111111111111111111111110100;
补码:11111111111111111111111111110101;
3.位操作符(双目操作符):&(按位与) |(按位或) ^(按位异或) ; (三者仅运用于整数,并且二者只作用于该变量的二进制序列)
(1)&:两个同类型变量二进制一 一对应序列同几为几,相异取0合成一个新的二进制序列;
(2)|:两个同类型变量的二进制序列同几为几,相异取1构成新二进制序列;
(3)^:使某些特定的位翻转,或者值的反转;如果各个二进制位的两个值不相同,则异或结果为1。 如果各个二进制位的两个值两个值相同,异或结果为0
例如不用第三个变量来使两个变量数值反转;a=a^b;b=a^b;a=a^b;(但是不建议用,效率低,可读性差,只能作用于整数……)
4.赋值操作符: =(可以给变量重新赋值);
复合赋值符 += -= *= /= %= >>= <<= &= |= ^= ;(好处在于简洁)
理解:x+=1则为x等于x加1,x<<=2则为x向左移两位再赋值给x…………其他的复合赋值同理,
5.单目操作符:(单目操作符则是与操作数有关,双目则是两个,三目则是三个)
(1)! 逻辑反操作,就是某变量的符号位不变其他位按位取反
(2)- 负值; + 正值;表述数字的正负
(3)& 取地址; * 间接访问操作符(解引用操作符);这两个操作符是相关的,用于指针
例如:
#include<stdio.h>
int main()
{int a=10;
int*pa=&a;
printf("%d \n %d",a,*pa);
return 0;
}
这两个的打印结果相同。(这次略过,下次将详解指针内容)
(4)sizeof 操作数的类型长度(以字节为单位)也可以用于求字符串个数int sz=sizeof(arr)/sizeof(arr[0]) ;不用strlen(使用strlen需要引用新的头文件#include<string.h>)它还可以求变量(类型)所占空间的大小。
(5)~ 对一个数的二进制按位取反
(6)-- 前置、后置-- 和++ 前置、后置++
前置则为先操作再使用,后置则为先使用再操作;
例子:
int x = a++;
//先对a先使用,再增加,这样x的值是10;之后a变成11;
int y = a--;
//先对a先使用,再自减,这样y的值是11;之后a变成10
(7)(类型) 强制类型转换 当一开始设置的变量类型在某处不符合要求时,在此处该变量的前面加上(想要的数据类型)进行转换。
6.关系操作符: > >= < <= !=(不相等) == (相等)
尤其注意:在编程的过程中== 和=不小心写错,导致的错误。
7.逻辑操作符:&&逻辑与 ; ||逻辑或
&&左边为假就不执行右边 ||左边为真就不执行右边。
8.条件操作符(三目操作符):x?y:z 判断x,对则y否则z
四.逗号表达式: 逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行, 整个表达式的结果是最后一个表达式的结果。
五.下标引用、函数调用和结构成员:(指数组)
(1).[] 下标引用 arr[]代表数组 arr[1]代表的时数组成员
(2).( ) 函数调用操作符 game()
六. 隐式类型转换--->整型提升(C的整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,)
简而言之就是为了方便使用变量,就把非int类型长度的变量提升到int一样的长度,正数和无符号位的用0在前面补充,负数前面全是1
同时长的变短的就是截断。