目录
1.操作符的分类
算术操作符:+,-,*,/,%
移位操作符:>>,<<
位操作符:&,|,^
赋值操作符:=,+=,-=,/=,*=,%=,>>=,<<=,&=,|=,^=
单目操作符:!,++,--,&(取地址),*,+,-,~,sizeof(类型)
关系操作符:>,<,=,>=,<=,!=
逻辑操作符:&&,||
条件操作符:? :
逗号表达式:,
下标引用:[ ]
函数调用:( )
结构成员访问: . , 、, ->
2.二进制和进制的转换
二进制:
- 二进制的每一位都是由0和1两个数字组成
- 二进制中满2进1
eg:1011就是一个二进制数字
进制的转化:
补充:无论采用哪一种进制计数,数值的表示都包含两个基本要素:基数和各位的‘权’(权:是指数制中每一固定位置对应的单位值,即就是常数,其值等于以基数为底,以数字符号所处的位置的序号为指数的整数次幂)
其他进制转化为二进制:采用位权展开,然后个项相加,就可得到对应的十进制数字
十进制转化为二进制:整数部分采用倒数取余,小数部分采用正数取整
二进制与八进制之间的相互转化:采用421法
二进制与十六进制之间的相互转化:采用8421法
补充:原码,反码和补码:
整数的二进制表示方法有三种:原码(某数字的二进制表示方法),反码和补码
有符号的整数的三种表示方法均有符号位和数值位两部分,二进制序列中,最高位的1位是被当做符号位,用0表示正,用表示负。
ps:正数的原反补码都相等。
负数的原反补码都不相等。
反码=在原码的基础上符号位不变其他位取反;补码=反码+1
总结:原码和补码之间的转换都可以采用取反+1
3.移位操作符(针对于二进制数字)
<< 左移操作符(右边用0填充,左边丢弃) ,左移n位,操作后的效果给原数字扩大2的n次方倍
>> 右移操作符 右移m位操作后的效果是给原数字缩小2的m次方
右移操作符:分为逻辑右移(左边用0填充,右边丢弃)和算数右移(左边用原该值的符号位填充,右边丢弃)
#include <stdio.h>
int main()
{
int a = 2;
int b=a << 2;
int c = a >> 1;
printf("%d %d", b, c);
return 0;
}
4.位操作符
& 按位与:对应二进制位有就为0,两个同时为1才为1
| 按位或:对应的二进制位有1就为1,两个同时为0才为0
^ 按位异或:对应的二进制位相同为0,相异为1
~ 按位取反
题目:a=5,b=3不创建中间变量
#include <stdio.h>
int main()
{
int a = 5;
int b = 3;
a = a ^ b;
b = a ^ b;//a^b^b=a
a = a ^ b;//a^a^b=b
printf("a=%d b=%d", a, b);
return 0;
}
5.单目操作符
!,++,--,&(取地址),*,+,-,~,sizeof(类型)
6.逗号表达式
exp1,exp2,exp3……expn
逗号表达式:就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果就是最后一个表达式的结果
7.下表访问【】,函数调用()
[ ]:下标引用操作符
操作数:一个数组名+一个索引值(下标)
int arr[10];
arr[9]=10;
[ ]的操作数是arr和9
():函数调用操作符,接受一个或者多个操作数是函数名,剩余的操作数就是传递给函数的参数
注:前面的章节中我有讲到!!!
8.结构成员访问操作符
结构体:是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:标量,数组,指针,甚至是其他结构体。
结构的声明:
struct tag { nember-list; }variable-list;
结构体变量的定义,初始化,结构成员的访问操作(直接访问和间接访问)
直接访问:结构体变量.成员名
间接访问:结构体指针 ->成员名
#include <stdio.h>
struct point
{
int x;
int y;
};
int main()
{
struct point p = { 3,4 };
struct point* ptr = &p;
ptr->x = 10;
ptr->y = 20;
printf("x=%d y=%d", ptr->x, ptr->y);
return 0;
}
9.操作符的属性:优先性和结合性(可以查官网)
优先性:和数学中运算优先性类似,但也是有不同指处的(相邻操作符的优先级高低,高的先算)
结合性:在有限性相同的情况下,从左向右或者从右向左求值
pS:尽量不要输入冗余复杂的表达式,确定唯一的计算路径。
这两个属性决定了表达式求值得计算顺序!!!