操作符
一、算术操作符:+ - * / %
1、特殊的除法
int a = 9/2;
此处得出的数为4,并不是因为是整形才计算为4
是因为,在c语言中,涉及小数计算,需要将计算的值修改为浮点型(小数)
才可以得出小数
如:float a= 9/2;
此处仍为4
故上述所说,若要求出小数点后的
需如:float a= 9 / 2.0 ;
才可以得出4.5
2、特殊的取模:
int a = 9 % 2;
a = 1
可以理解为,取模实际上就是 取余数!
二、移位操作符: << >> //左移 右移
例:
int a = 2 ;
int b = a << 1;
此处为二进值移位,则,2在2进制中表示的是
00000000000000000000000000000010
而移位左后就是
00000000000000000000000000000100
变成了4
三、位操作符: & 按位与 |按位或 ^ 按位异或
四、赋值操作符: = += -= *= /= &= ^= |= >>= <<=
例:a = a+5;
可通 a += 5;这个上述的赋值操作符都可以如此表达;
五、单目操作符 : ! 逻辑反操作 -负数 +正数 &取地址 sizeof 操作数的类型长度
~对一个数的二进制按位取反 --前置/后置减减 ++前置/后置加加 *间接访问操作符
解: a+b; 此处 + 是双目操作符
则 :单目操作符就是i只有一个数运算的操作符
!逻辑取反 例:
int a = 0;
printf("%d\n",!a);
此处要理解的是,在c语言中 1 为真,0为假,此处现在 a表示0,
而现在!a表示逻辑取反,要变成假的,这个时候这里就变成0;
sizeof 例
int arr[10]={0}
int sz = sizeof(arr) / sizeof(arr[0]);
此处计算的是数组的元素个数
~按位取反
int a = 0;
printf("%d",~a);
此处按位取反涉及到二进制储存方式
整数在内存中存储的是补码
原码反码补码只针对负数
一个整数的二进制表示有三种,以上述a为例
原码 10000000000000000000000000000001
反码 1111111111111111111111111111111111110
补码 1111111111111111111111111111111111111
得出以下结果是因为
按位取反是对内存里直接操作的,所以原来0的原码因该是
00000000000000000000000000000000
但是储存里面存的是补码是
1111111111111111111111111111111111111
而此时又需要计算出反码,反码是补码-1
得出
1111111111111111111111111111111111110
反码取反对最高位不参与运算,则变成
100000000000000000000000000000001
此处特别注意按位取反对符号位有效,但是原码/补码/反码不涉及最高位的正负位的计算,就是说,原码补码反码不涉及最高位的正负的改变
补码 = 反码 + 1
反码 = 补码 - 1