操作符分类:
*算术操作符
*移位操作符
*位操作符
*赋值操作符
*单目操作符
*关系操作符
*逻辑操作符
*条件操作符
*逗号表达式
*下标引用、函数调用和结构成员
——————————————-
*算术操作符
+ - * / %
1.除了%操作符外,其他的几个操作符可以作用于整数和浮点数。
2.操作符 / 如果两边都为整数,则结果为整数。两边只要有任意一个数是浮点数(或者两个都为浮点数),则结果为 浮点数。列:(3/2=1、3/2.0=1.5)
3.操作符%两边必须为整数,结果是整除之后的余数。如果被除数小于除数,则结果为被除数。列:(10%3=1、10%4=2、3%5=3)
*移位操作符(移二进制序列)
右位移操作符
<< 左位移操作符
列:(a=10 a<<1=20 a=10,位移之后a的值不变)(a=10 a=a<<1 a=20)
右移:(算数右移:左边补原来的的符号,右边丢弃 逻辑右移:左边补零,右边丢弃)
*位操作符
& //按位与
| //按位或
^ //按位异或
(它们三个的操作数必须是整数)
*赋值操作符
=
将变量赋值成想要的值
int a=0,b=0;
a=20;
b=a;//b=20
b=a=10//a=10,b=10(连续赋值)
(复合赋值符)
- +=
- -=
- *=
- /=
- %=
- >>=
- <<=
- &=
- |=
- ^=
这些运算符都可以写成复合的效果
int m=7;
x=x+1;//x=8
x+=1;//x=8,与上面效果一样
*单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 减减(--前置 后置--)
++ 加加(++前置 后置++)
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
int a=5,b=3;
printf("%d",a++);//输出结果为5,先输出再自增
printf("%d",++a);//输出结果为6,先自增在输出
printf("%d",b--);//输出结果为3,~
printf("%d",--b);//输出结果为2,~
*关系操作符
>
>=
<
<=
!= 不相等
== 相等
*逻辑操作符
&& 逻辑与 (1&&2,结果为1(真),1和2都为真)
|| 逻辑或 (1||0,结果为1(真),1为真0为假)
*条件操作符
A>B?C:D(A如果大于B,则执行C.不大于则执行D)
例:
int a=6,b=2,c=0,b=0;
c=a>b?a+b:a-b; //执行结果为c=8
d=b>a?a+b:a-b; //执行结果为d=4
*逗号表达式
逗号表达式就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
*下标引用、函数调用和结构成员
1.[ ]
操作数:一个数组名+一个索引值
arr[7] //arr为数组名,7表示arr数组中有7个元素
2.()
函数调用操作符
接收一个或者多个操作数:第一个操作数的是函数名,剩余的操作数是传递给函数的参数。
3.访问一个结构体成员
. 结构体.成员名
-> 结构体指针->成员名
操作符的属性
复杂表达式求值得三个影响因素
1.操作符的优先级
2.操作符的结合性
3.是否控制求值顺序
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两个的优先级相同,则取决于他们的结合性!
int a=1;
b=(a++)+(a++)+(a++);//这是一个问题代码,不同的编译器执行出的结果也不相同。(例:vc6.0中值为10,vs中值为12)