c语言操作符的分类:
算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符,逗号表达式,下表引用、函数调用和结构成员
算术操作符: + - * /(除) %(取余)
1.对于除 / 来说,只要有浮点数执行的就是浮点数除法,只有当两个操作数都为整数时候,才执行整数除法。
/ 运算结果取的是商值,不遵循四舍五入的规律,只保留整数部分。如3/2=1.5 输出的是 1
用法:可以实现对一个数的降位,比如153不断除10,可以依次得到15,1。
2. %两边的操作数必须都要是整数,返回的是整出后的余数。
用法:可以用来实现对数字的拆分,比如153 对10取余 得到3,153对100取余 得到53。
移位操作符:<< (左移操作符) >>(右移操作符)
左移操作符规则:移位移动的是二进制位;左边抛弃,右边补0;
例如;int num = 10;
num<<1;
10 的二进制表示形式为 00000000 00000000 00000000 00001010
左移一位结果 000000000 00000000 00000000 00010100 (结果是十进制的20)
注意: num在没有被赋值的情况下,自身的值没有发生变化,仍然是10。
对比左移前后的变化,可知,左移1位,每位二进制的数是移动前的2倍。同理,左移2位,结果变成原来的4倍。
因此,左移 N 位, 结果是 原来数值的 2的N次方倍。
右移操作符
移位规则:取决于编译器。
右移运算分为两种:(1)逻辑移位:左边用0填充,右边丢弃。 (2)算术位移:左边用改原值的符号位填充,右边丢弃。
注意:比较两种移位规则,算术位移更加合理,更符合思考问题的方式,而逻辑位移容易发生改变 数值正负的情况,属于暴力移 位,不符合逻辑。
对于移位运算符,不能移动负数位,因为这个是标准未定义的。
位操作符:
& 按(二进制)位与 规则:二进制的对应位上,有0出0,全1出1
| 按(二进制)位或 规则:二进制的对应位上,有1出1,全0出0
^ 按(二进制)位异或 规则:二进制的对应位上,相异为1,相同为0
注意:他们的操作数必须都是整数。
规则:有0为0,全1 出1
赋值操作符:
就是赋值:=、+=、-=、/=、%=、>>=、<<=、&=、|=、^=。
例如,a = a+ 10 可以写成 a+=10;
单目操作符:
! 逻辑反 操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
注意:非0即真,只有0表示假。 1,-1,表示的都是真。!(-1) 表示的是假。
sizeof 是操作符,不是函数。 sizeof( 表达式) 中表达式不参与计算, 例如,表达式为s = a +b 事实上s的值没有发生改变,不是(a+b)。
前置++:先++后运算; 后置++:先运算后++
关于数组的取地址: int arr[10]={0};
printf("%p\n",&arr);指向数组首地址地址;
printf("%p\n",arr+1);指向首元素下一个元素的地址;
关系操作符:>,> = 、<、<=、!=、==。
注意:= 是赋值运算;==用来判断相等
逻辑运算符:
&& 逻辑与 规则:有0出0,全1 出1
|| 逻辑或 规则:有1出1,全0 出0
需要格外注意的是:
对于多个逻辑与 && 的运算,比如 A&&B&&C, 如果A&&B值 为假,判断就停止了,不用继续往后计算。如果为真,需要往下继续运算。
对于多个逻辑或 || 运算, 比如A||B||C,如果A||B 为真,判断就停止了,不用继续往后计算。如果为假,则需要继续往后判断。
逗号表达式:
exp1 , exp2 ,exp3....
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
比如:
int a = 1;
int b = 2;
int c = (a>b, a = b + 10, a, b =a + 1);