一、操作符的分类
二、算数操作符(+、-、*、/、%)
这些操作符大家应该都懂,我就简单说一下:
- =、-、 * 、/ 两边两个操作数都为整数都为整数,才执行整数的运算法则,只要其中有一个浮点数,则执行浮点数运算
- % 用于求余数,操作符的两个操作数必须为整数。返回的是整除之后的余数
三、移位操作符(<<、>>)
注意:所有的整数在内存中都是以补码进行存储的,我们的左右移操作符都是对补码进行直接操作的;
移动前是补码,移动后依然是补码。
警告:对于移位操作符,不要移动负数位,这个是标准未定义的
3.1左移操作符 <<
#include<stdio.h>
int main()
{
int a = 10;
int b = a << 1;
//00000000000000000000000000001010
//00000000000000000000000000010100
printf("a = %d\n",a);
printf("b = %d\n",b);
}
当a为负数时的移动:左移还是比较干脆的,正负数都一样
.2 右移操作符 >>
移位规则
1.逻辑右移:左边⽤0填充,右边丢弃
2.算术右移:左边⽤原该值的符号位填充,右边丢弃
但是到底是逻辑右移还是算术右移,这个标准并没有确定,是取决于编译器的
对于正数来说,无论算术右移还是逻辑右移结果都是一样的;
下面我们来看下负数:
四、位操作符 (&、|、^、~)
& -- 按位与 && -- 逻辑与(并且)
| -- 按位或 || -- 逻辑或(或者)
请不要混乱了,他们是不一样的
注意:它们的操作数必须是整数
4.1 & -- 按位与
使用补码进行按位与,规则是:对应二进制位有0就是0,两个同时为1才为1
4.2 | -- 按位或
使用补码进行按位或,规则是:对应二进制位有1就是1,两个同时为0才为0
4.3 ^ -- 按位异或
使用补码进行按位或,规则是:相同为0,相异为1
4.4 ~ -- 按位取反
当我们了解了位操作符后,就有这样一道题:不创建临时变量,实现两个整数的交换 这里我只讲一下用按位异或解决的方法
五、单目操作符(!、++、--、&、*、+、-、~ 、sizeof、 (类型))
! 逻辑反操作
++ 前置、后置++
--前置、后置--
& 取地址
* 解引用操作符
+ 正值
- 负值
~ 按位取反
sizeof 操作数的类型长度(以字节为单位)
(类型)强制类型转换
5.1 !- 逻辑取反
两种不一样的写法,能得到同样的结果
简单来说就是在逻辑上是真,用!后就是逻辑上是假了;逻辑上是假,用!后逻辑上就是真了
5.2 前置、后置的(++、--)
前置就是先++后使用,后置就是先使用后++;--同理
通过对比我们可以看出图1是a先++后赋值给b, 图2是先赋值给b,后a++
5.3 &--取地址
取出的是所有地址中最低的一个地址,可以用%p将啊的地址打印
5.4 * -- 解引用操作符
通过指针的方式间接访问变量,对指针进行解引用得到其中的值
5.5 +、- 、~
这里就不过多解释了
5.6 sizeof
sizeof是用来求操作数的类型长度(以字节为单位)
注意:sizeof不是函数
六、逗号表达式
exp1, exp2, exp3, …expN
逗号表达式:逗号隔开的一串表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果
虽然是最后一个表达式的结果,但前面的表达式依然要计算
七、下标访问[ ]、函数调用( )
7.1 下标访问[ ]
int main()
{
int arr[10] = { 0 };
arr[5] = 6;// [] - 下标引用操作符
//[] 是操作符,它的操作数是:arr,5
return 0;
}
7.2 函数调用()
函数调用操作符至少有一个操作数,函数名
八、结构体成员访问操作符
这里我简单介绍一下结构体
struct Student
{
char name[20];
char sex[10];
int age;
char id[13];
}s1,s2;//全局变量
struct Student s4;//全局变量
int main()
{
struct Student s3;//局部变量
struct Student s3 = {“张三”,"男",“18”,"00000000" }; //初始化
return 0;
}
8.1 . 操作符
结构体成员的直接访问是通过点操作符(.)访问的
使⽤⽅式:结构体变量.成员名
8.2 ->操作符
使⽤⽅式:结构体指针->成员名
九、操作符的属性(优先级、结合性)
9.1 优先级
优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是不⼀样的
相邻操作符优先级高的先执行
9.2 结合性
如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右结合(从右到左执⾏),⽐如赋值运算符( = )
如果写的哪里有问题,欢迎指导!