操作符
分类:
算数操作符 移位操作符 位操作符 赋值操作符 单目操作符
关系操作符 逻辑操作符 条件操作符 逗号表达式
下标应用 函数调用 结构成员
算数操作符
+ - * / %
1.除了%操作符之外,其他的几个操作符可以作用于整数和浮点数.
2.对于 / 操作符如果两个操作数都为整数,执行整数除法.而只要有浮点数执行的就是浮点数除法.
3.% 操作符的两个操作数必须为整数.返回的是整除之后的余数.
移位操作符
<< 左移操作符 >> 右移操作符
左移操作符 移位规则: 左边抛弃,右边补 0 .
右移操作符 移位规则: 1> 有符号整数右移称算数移位,最高位补符号位,右边丢弃 2>无符号整数右移称逻辑移位,最高位补0,右边丢弃
注意:对于移位运算符,不要移动负数位,这个是标准未定义的
位操作符
& 按位与
| 按位或
^ 按位异或
注: 他们的操作数必须是整数.
赋值操作符
赋值操作符是一个很棒的操作符,他可以然你得到一个你之前不满意的值,也就是你可以给自己重新赋值.
包括复合赋值符
+=
*=
/=
%=
>>=
<<=
&=
|=
^=
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置,后置--
++ 前置,后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
关系操作符
>
>=
<
<=
!= 用于测试"不相等"
== 用于测试"相等"
逻辑操作符
&& 逻辑与
|| 逻辑或
条件操作符
exp1?exp2:exp3 //若表达式exp1为真,输出exp2,反之输出exp3
逗号表达式
exp1,exp2,exp3....
逗号表达式,就是用逗号隔开的多个表达式,从左向右依次执行.整个表达式的结果是最后一个表达式的结果
小标引用,函数调用和结构成员
1.[ ] 下标引用操作符
操作数: 一个数组名+ 一个索引值
2.( ) 函数调用操作符,接受一个或者多个操作数: 第一个操作数是函数名,剩余的操作数就是传递给函数的参数
3.访问一个结构的成员
结构体.成员名 或者 结构体指针->成员名
表达式求值
表达式求值的顺序一部分是由操作符的优先级和结核性决定,
同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型
隐式类型转换
C的整形算术运算总是以缺省整型类型的精度来进行的.
为了获得这个精度,表达式中的字符和短整型操作数在使用之前转换为普通整型,这种转换称为整型提升.
/*********************
*1.整形提升,char short 运算时提升成int
**********************/
//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
// char c = 0xb6;
// short s = 0xb600;
// int i = 0xb6000000;
// if (c == 0xffffffb6)
// printf("c\n");
// if (s == 0xffffb600)
// printf("s\n");
// if (i == 0xb6000000)
// printf("i\n");
// system("pause"); //输出c,s,i 即char short 在运算时提升为int 型,高位补符号位
// return 0;
//}
算术转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行,
下面的层次体系称为寻常算数转换
long double
double
float
unsigned long int
long int
unsigned int
int
如果某个操作数的类型在上面的这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算.
操作符的属性
复杂表达式的求值有三个影响的因素
1.操作符的优先级
2.操作符的结合性
3.是否控制求值顺序
操作符 | 描述 | 用法示例 | 结果类型 | 结合 性 | 是否控制求值顺 序 |
() | 聚组 | (表达式) | 与表达式 同 | N/A | 否 |
() | 函数调用 | rexp(rexp,...,rexp) | rexp | L-R | 否 |
[ ] | 下标引用 | rexp[rexp] | lexp | L-R | 否 |
. | 访问结构成员 | lexp.member_name | lexp | L-R | 否 |
-> | 访问结构指针成员 | rexp->member_name | lexp | L-R | 否 |
++ | 后缀自增 | lexp ++ | rexp | L-R | 否 |
-- | 后缀自减 | lexp -- | rexp | L-R | 否 |
! | 逻辑反 | ! rexp | rexp | R-L | 否 |
~ | 按位取反 | ~ rexp | rexp | R-L | 否 |
+ | 单目,表示正值 | + rexp | rexp | R-L | 否 |
- | 单目,表示负值 | - rexp | rexp | R-L | 否 |
++ | 前缀自增 | ++ lexp | rexp | R-L | 否 |
-- | 前缀自减 | -- lexp | rexp | R-L | 否 |
* | 间接访问 | * rexp | lexp | R-L | 否 |
& | 取地址 | & lexp | rexp | R-L | 否 |
sizeof | 取其长度,以字节表 示 | sizeof rexp sizeof(类 型) | rexp | R-L | 否 |
(类 型) | 类型转换 | (类型) rexp | rexp | R-L | 否 |
* | 乘法 | rexp * rexp | rexp | L-R | 否 |
/ | 除法 | rexp / rexp | rexp | L-R | 否 |
% | 整数取余 | rexp % rexp | rexp | L-R | 否 |
+ | 加法 | rexp + rexp | rexp | L-R | 否 |
- | 减法 | rexp - rexp | rexp | L-R | 否 |
<< | 左移位 | rexp << rexp | rexp | L-R | 否 |
>> | 右移位 | rexp >> rexp | rexp | L-R | 否 |
> | 大于 | rexp > rexp | rexp | L-R | 否 |
>= | 大于等于 | rexp >= rexp | rexp | L-R | 否 |
操作符 | 描述 | 用法示例 | 结果类型 | 结合 性 | 是否控制求值顺 序 |
< | 小于 | rexp < rexp | rexp | L-R | 否 |
<= | 小于等于 | rexp <= rexp | rexp | L-R | 否 |
== | 等于 | rexp == rexp | rexp | L-R | 否 |
!= | 不等于 | rexp != rexp | rexp | L-R | 否 |
& | 位与 | rexp & rexp | rexp | L-R | 否 |
^ | 位异或 | rexp ^ rexp | rexp | L-R | 否 |
| | 位或 | rexp | rexp | rexp | L-R | 否 |
&& | 逻辑与 | rexp && rexp | rexp | L-R | 是 |
|| | 逻辑或 | rexp || rexp | rexp | L-R | 是 |
?: | 条件操作符 | rexp ? rexp : rexp | rexp | N/A | 是 |
= | 赋值 | lexp = rexp | rexp | R-L | 否 |
+= | 以...加 | lexp += rexp | rexp | R-L | 否 |
-= | 以...减 | lexp -= rexp | rexp | R-L | 否 |
*= | 以...乘 | lexp *= rexp | rexp | R-L | 否 |
/= | 以...除 | lexp /= rexp | rexp | R-L | 否 |
%= | 以...取模 | lexp %= rexp | rexp | R-L | 否 |
<<= | 以...左移 | lexp <<= rexp | rexp | R-L | 否 |
>>= | 以...右移 | lexp >>= rexp | rexp | R-L | 否 |
&= | 以...与 | lexp &= rexp | rexp | R-L | 否 |
^= | 以...异或 | lexp ^= rexp | rexp | R-L | 否 |
|= | 以...或 | lexp |= rexp | rexp | R-L | 否 |
, | 逗号 | rexp,rexp | rexp | L-R |
|