1.算术操作符
运算符 | 介绍 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算,整型相除结果还是整型,有一个是浮点型结果就是浮点型 |
% | 取模(求余)运算,两个操作数必须都是整型,返回结果是余数 |
2.移位操作符
运算符 | 介绍 |
---|---|
<< | 左移运算符,左边抛弃、右边补0 |
>> | 右移运算符,移位规则和编译环境有关,分为逻辑移位和算术移位 |
逻辑移位:右边抛弃,左边补0
算术移位:右边抛弃,左边补符号位
注意:移位运算符是对内存中的补码进行移位,只能用于整型(因为只有整型是使用补码形式存储,浮点数在内存中是以符号+指数+尾数存储的)
左移一位有乘2的效果,二进制数全部向左移了一位,每一位的权重是原来的二倍,同理右移一位有除以2的效果。
对了,还有个要强调的点:移位运算符并不改变变量原先的值,整个表达式的结果才是移位后的结果!
举个栗子:
int a = 1;
int b = 0;
b = a << 1;
运算之后a的值还是1哦,b的值才是a移位后的结果。
3.位操作符
操作符 | 介绍 |
---|---|
& | 按位与,有0则结果为0 |
丨 | 按位或,有1则结果为1 |
^ | 按位异或,相同为0,相异为1 |
注意:位操作也是对补码进行操作的,和移位运算符相同,也只能用于整型
几个有趣的位运算:
a & a = ?
a | 0 = ?
a ^ 0 = ?
a ^ a = ?
a&a=a; 对应位都是相同的,结果还是本身
a | 0=a;这个没啥好说的吧,反正觉得或操作符很大方
a^0 =a;是0的位结果还是0,是1的位结果还是1
a^a = 0;相同为0,对应位全都相同,结果为0
4.赋值操作符
= 和汇编中的MOV有异曲同工之妙!
复合赋值符
+=
-=
*=
/=
%=
>>=
&=
|=
^=
简洁好用!
5.单目操作符
操作符 | 介绍 |
---|---|
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
~ | 对一个数的二进制按位取反 |
– | 前置、后置- - |
++ | 前置、后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
! 逻辑反操作 和 ~ 按位取反
! 逻辑 反操作,表达式的逻辑值(真值)有两种情况:真和假
!操作符用于对真值取反,把真的变成假的,假的变成真的
而~ 按位 取反的结果数的位数不变,每一位进行取反
&取地址符
常见场景:
int a;
int *p=&a;
scanf("%d",&a);
数组名本身就是一个地址,代表的是数组首元素的地址
对数组名取地址,得到的是整个数组的地址
#include<stdio.h>
int main()
{
int arr[10];
printf("%p\n", &arr);
printf("%p\n", arr);
return 0;
}
运行结果:
002CFA90
002CFA90
请按任意键继续…
看起来好像一样,但其实是有区别的:
#include<stdio.h>
int main()
{
int arr[10];
printf("%p\n", &arr);
printf("%p\n\n", &arr+1);
printf("%p\n", arr);
printf("%p\n", arr+1);
return 0;
}
运行结果:
0044FD50
0044FD78
0044FD50
0044FD54
请按任意键继续…
(arr+1)-arr=4;
(&arr+1)-&arr=40;
可见arr+1时只加了一个数组元素的大小,而&arr+1时则加了整个数组元素的大小
sizeof
sizeof操作符是用来求变量或者类型的大小的,它还是C语言32个关键字之一,但绝对绝对不是函数
最直接的证据就是sizeof在测变量的大小时,圆括号可以省略:
sizeof(a)
sizeof a
这两种表示是相同的,但是求类型的大小时必须要有圆括号
划个重点:
sizeof(数组名)——数组名表示整个数组,计算的是整个数组的大小
&数组名——数组名表示整个数组,取出的是整个数组的大小
除此之外,所有的数组名都表示数组首元素地址
还有,sizeof内部的表达式不计算,原因是sizeof是在编译时进行的,而变量在运行时才被创建,所以sizeof计算变量的大小时也只是看看类型,不管具体的值。
++、- -
这个应该都知道,前置++、- -是先自增自减再运算,后置的是先运算再自增减
a++ <=> (int temp = a, a = a + 1,temp)
++a <=>a = a + 1;
6.关系操作符
操作符 | 介绍 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 不等于 |
== | 等于 |
注意等于与赋值区分,非常容易犯的小错误,还不容易查错
所以判断相等时把常数写在左边,像这样
if(5 == a)
不小心写成赋值编译器也能检查出来,因为常数不能被赋值~
7.逻辑操作符
操作符 | 介绍 |
---|---|
&& | 逻辑与,同真为真,有假为假 |
丨丨 | 逻辑或,有真为真 |
~ | 逻辑非 |
注意:&&在遇到假时就不再继续判断了,因为结果注定是假了,同理,||在遇到真时也不继续判断
8.条件操作符
(exp1)?(exp2):(exp3)
if(a > 5)
b = 3;
else b = -3;
等同于
b = a>5?3:-3;
简单,好用~
9.逗号表达式
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
10.下标引用、函数调用和结构成员
1.[ ]
操作数:一个数组名+一个索引值
2.( )
第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3.访问一个结构的成员
操作符 | 介绍 |
---|---|
. | 结构体.成员名 |
-> | 结构体指针->成员名比特 |