操作符
1.操作符的分类
- 算数操作符:
+ , -, * , / , %
- 移位操作符:
<< >>
- 位操作符:
& | ^
- 赋值操作符:
= , += , -= , *= , /= , %= , <<= , >>= , &= , |= , ^=
- 单目操作符:
! , ++ , -- , & , * , + , - , ~ ,sizeof
- 关系操作符:
> , >= , < , <= , == , !=
- 逻辑操作符:
&& , ||
- 条件操作符:
? :
- 逗号表达式:
,
- 下标引用:
[ ]
- 函数调用:
( )
- 结构体成员访问:
. , ->
2.二进制和进制转换
二进制中满2进1
二进制的数字每一位都是0~1的数字组成
2.1十进制转二进制
除2取余
由下往上依次所得的余数就是十进制转换出的二进制
所以125的二进制是:1111101
2.2 二进制转换八进制和十六进制
2.2.1 二进制转换为八进制
八进制的数字每一位是0~7的数字,各自写成二进制,最多有3个二进制就足够了,比如7的二进制是111
比如:二进制01101011,换成八进制:0153,0开头的数字,会被当成八进制
2.2.2 二进制转换十六进制
十六进制的数字由0~9 ,a ~ f 组成最多有4个二进制就足够了,比如f 是1111
比如:二进制01101011,换成十六进制:0x6b,十六进制表示的前面加0x
3.原码,反码,补码
整数的二进制表示方法有三种,原码,反码和补码
有符号整数的三种表示方法均有符号位和数值位两部分,二进制序列中,最高位的1位是被当做符号位,剩余的都是数值位
符号位都是用0表示“正”,用1表示“负”
正整数的原,反,补码都相同
负整数的三种表示方法各不相同
原码:直接将数值按照正负数的形式翻译成二进制得到的
反码:将原码的符号位不变,其他位次依次按位取反
补码:反码+1
补码得到原码也是可以用:取反,+1操作
对于整型来说:数据存放内存中就是存放的补码
4.移位操作符
<<
左移操作符
>>
右移操作符
注:移位操作符的操作数只能是整数
4.1 移位操作符
移位规则:左边抛弃,右边补0
#include <stdio.h>
int main()
{
int num=10;
int n=num<<1;
printf("n=%d\n",n);//20
printf("num=%d\n",num);//10
return 0;
}
4.2 右移操作符
移位规则:首先右移运算分两种
1.逻辑右移:左边用0填充,右边丢弃
2.算术右移:左边用原该值的符号位填充,右边丢弃
#include <stdio.h>
int main()
{
int num=-1;
int n=num>>1;
printf("n=%d\n",n);
printf("num=%d\n",num);
return 0;
}
警告:对于移位运算符,不要移动负数位,这个标准是未定义的
例如:
int num=10;
num>>-1;//error
5.位操作符:&,|,^,~
位操作符:
& //按位与
| //按位或
^ //按位异或
~ //按位取反
注:他们的操作数必须是整数
- & :同一二进制位上的数字都是1的话。&的结果为1,否则为0
0&0=0 1&1=1 0&1=0 - | : 只要参与运算的双方其中有一个是1,结果就是1,同0才为0
0|0=0 0|1=1 1|1=1 - ^ : 只要参与运算的双方互异,结果就是1
0^1=1 0^0=0 1^1=0
6.逗号表达式
exp1,exp2,exp3,exp4,……expn
逗号表达式,就是用逗号隔开的多个表达式
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
int a=1;
int b=2;
int c=(a>b,a=b+10,a,b=a+1);//逗号表达式
c=13
7.下标访问[ ],函数调用
7.1 [ ] 下标引用操作符
操作数:一个数组名+下标
int arr[10];//创建数组
arr[9]=10;//实用下标引用操作符
[ ]的两个操作数是arr 和 9
7.2 函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
#include <stdio.h>
void test()
{
printf("hehe\n");
}
int main()
{
test();//这里的()就是作为函数调用操作符
return 0;
]