操作符的分类:
算术操作符
移位操作符
位操作符
赋值操作符
逻辑操作符
单目操作符
关系操作符
条件操作符
逗号表达式
下标引用
函数调用和结构成员
算术操作符
+ 加
- 减
* 乘
/ 除
% 取余数
移位操作符
<< 左移
>> 右移
左移操作符 移位规则:
左边抛弃,右边补0。
右移操作符 移位规则:
右移运算分两种:
1.算术右移:左边用该值的符号位填充。
2.逻辑右移:左边用0补充,右边丢弃。
int a=3;
int b=5;
a>>1;
011 010
a=2;
b<<1;
101 1010
b=10;
位操作符
& 按位与
^ 按位异或
| 按位或
注:他们的操作数必须是整数。(位操作符的应用见我的第二篇博客)
赋值操作符
复合赋值操作符
= 赋值
+= a=a+1可以写为a+=1
-= a=a-1可以写为a-=1
*= a=a*1可以写为a*=1
/= a=a/1可以写为a/=1
^= a=a^1可以写为a^=1
&= a=a&1可以写为a&=1
%= a=a%1可以写为a%=1
>>= a=a>>1可以写为a>>1
<<= a=a<<1可以写为a<<1
单目操作符:
! 逻辑取反操作
+ 正
- 负
~ 按位取反
(类型) 强制类型转换 (应用见指针进阶博客)
sizeof 操作数类型长度
* 间接访问(解引用操作符) (应用见指针博客)
& 取地址
++ 前置++,后置++ 前置++,先++,后使用
后置++,先使用,后++
-- 前置--,后置--
前置--,先--,后使用
后置--,先使用,后--
关系操作符:
== 用于测试(判断)等于
!= 用于测试(判断)不等于
<= 小于等于
>= 大于等于
< 大于
> 小于
逻辑操作符:
&& 逻辑与
|| 逻辑或
条件表达式:
exp1?exp2:exp3
exp1,exp2...expN
逗号表达式:从左向右依次执行,整个表达式的结果是最后一个表达式的结果
下标引用操作符:
[]
arr[10]
函数调用操作符:
()
Add(10,20);
访问结构体的成员
.
->
整型提升
(隐式发生):两个char类型的变量相加,需要提升成一个普通整型的字节长度。
char a = 3;
char b = 127;
00000011 a
01111111 b
00000000000000000000000000000011 补充符号位
00000000000000000000000001111111 补充符号位
00000000000000000000000010000010 a+b
10000010 c
11111111111111111111111110000010 补充符号位
11111111111111111111111100000001 c反码
10000000000000000000000011111110 c原码
char c = a + b;
printf("%d\n",c);
输出结果为-126,而不是130。
算术转换(隐式转换):如果一个int类型的变量和一个double类型的变量进行计算,则 先将int 类型转换为double类型(向上转换)。
操作符的属性:
1.操作符的优先级
2.操作府的结合性
3.是否控制求值顺序
结合性:
L-R(从左向右) | R-L(从右向左) |
---|---|
( ) | ++ |
[ ] | - - |
. | += |
-> | -= |
++ | *= |
- - | /= |
+ | %= |
- | >>= |
* | <<= |
/ | & |
% | * |
>> | sizeof |
<< | () |
> | &= |
< | ^= |
>= | |= |
<= | = |
== | / |
!= | / |
& | / |
&& | / |
^ | / |
| | | / |
, | / |