操作符大概分为以下几类:
1.算术操作符
2.移位操作符
3.位操作符
4.赋值操作符
5.单目操作符
6.关系操作符
7.逻辑操作符
8.条件操作符
9.逗号表达式
10.下表引用,函数调用和结构成员
算数操作符
+ - * / %
/ 可用于整数和浮点数,只要有浮点数参与就是浮点除法。
% 只能作用于整数。
移位操作符
<< 左移操作符
>> 右移操作符
移位操作符,移动的是数字的二进制码而不是本身数字,
右移时 分为算术右移和逻辑右移两种情况
算术右移是左边用原该值的符号位填充
逻辑右移是左边补零
比如 -1 存储补码
111111111111111111111111
算术右移
111111111111111111111111
逻辑右移
011111111111111111111111
位操作符
& //按位与
| //按位或
^ //按位异或
它们的操作数必须是整数,
赋值操作符
=
当然还有复合赋值符
+= -= *= /= %= >>= <<= &= |= ^=
作用都和简单+=一样
x += 1; ======> x = x + 1;
单目操作符
! 逻辑反操作
- 负值
+ 正直
& 取地址
sizeof 真是一个单目操作符,不是函数
~ 对一个数的二进制按位取反
-- 有前置,后置
++ 有前置,后置
* 解引用操作符
(类型) 强制类型转换
关系操作度符
> >= < <= != ==
使用时注意 == 和辅助 = 的区别
逻辑操作符
&& 逻辑与 有一个为假则返回假
|| 逻辑或 有一个为真则返回真
返回的是 真或假
exp1 && exp2 如果exp1为真,则计算exp2. 但如果exp1 为假,则exp2不计算;
exp1 || exp2 如果exp1为真,则不计算exp2,但如果exp1为假,则exp2计算;
条件操作符
exp1 ?exp2 :exp3
exp1为真 则输出exp2,为假 则输出exp3
逗号表达式
exp1,exp2,exp3,……exp n
从左向右依次执行,但最后的exp n 为整个表达式的结果
下标引用,函数调用和结构成员
[] ()
访问一个结构成员
#include<stdio.h>
struct Stu
{
char name[10];
int age;
char sex[5];
double score
};
void set_age1(struct Stu stu)
{
stu.age = 18;
}
void set_age2(struct Stu* pstu)
{
pstu->age = 18;
}
int main()
{
struct Stu stu;
struct Stu* pStu = &stu;//结构成员访问
stu.age = 20;//结构成员访问
set_age1(stu);
pStu->age = 20;//结构成员访问
set_age2(pStu);
return 0;
}
表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型
隐形类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
整形提升意义
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int 的字节长度,同时也是CPU的通用寄存器的长度。 因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。 通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这 种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算
表达式 结合性
() 聚组 (表达式)
() 函数调用 L-R
[ ] 下标引用 L-R
. 访问结构成员 L-R
-> 访问结构指针成员 L-R
++ 后缀自增 L-R
-- 后缀自减 L-R
! 逻辑反 R-L
~ 按位取反 R-L
+ 单目,表示正值 R-L
- 单目,表示负值 R-L
++ 前缀自增 R-L
-- 前缀自减 R-L
* 间接访问 R-L
& 取地址 R-L
sizeof
类型转换 (类型) R-L
* 乘法 L-R
/ 除法 L-R
% 整数取余 L-R
+ 加法 L-R
- 减法 L-R
<< 左移位 L-R
>> 右移位 L-R
> 大于 L-R
>= 大于等于 L-R
< 小于 L-R
<= 小于等于 L-R
== 等于 L-R
!= 不等于 L-R
& 位与 L-R
^ 位异或 L-R
| 位或 L-R
&& 逻辑与 L-R
|| 逻辑或 L-R
?: 条件操作符 N/A
= 赋值 R-L
+= 以...加 R-L
-= 以...减 R-L
*= 以...乘 R-L
/= 以...除 R-L
%= 以...取模 R-L
<<= 以...左移 R-L
>>= 以...右移 R-L
&= 以...与 R-L
^= 以...异或 R-L
|= 以...或 R-L
, 逗号 L-R