操作符和表达式
1.操作符分类:
1.1算数操作符:
+ - * / %
- 需要注意的是:
%操作符的两个操作数必须为整数
/ 操作符如果两个操作符都为整数,则为整数除法,如果有一个操作数为浮点数,则为浮点数除法
1.2移位操作符:
不要移动负数位,这个是标准未定义的
<< 左移操作符
>> 右移操作符
- 左移操作符的移位规则:
左边抛弃,右边补0
- 右移操作符的移位规则:
1.逻辑移位 左边用0填充,右边丢弃
2.算术移位 左边用符号位填充,右边丢弃
1.3位操作符
注意:操作数必须是整数
& 按位与
| 按位或
^ 按位异或
1.4赋值操作符
=
- 复合操作符:+=,-=等等
1.5单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
1.6关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
警告: 在编程的过程中== 和=不小心写错,导致的错误
1.7逻辑操作符
&& 逻辑与
|| 逻辑或
注意区分按位与,按位或
1&2----->0
1&&2---->1
1|2----->3
1||2---->1
1.8条件操作符
exp1 ? exp2 : exp3
1.9逗号表达式
exp1, exp2, exp3, …expN
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1)
printf("%d",c);
打印结果为:13
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
1.10下标引用,函数调用,结构成员
- 下标操作引用符
int arr[10]; //创建数组
arr[9]=19;
-
( ) 函数调用操作符 接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
-
访问一个结构的成员
结构体.成员名 结构体指针->成员名
2.表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。
2.1隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
算数转换
下面的层次体系称为寻常算术转换:
操作符的属性
复杂表达式的求值有3个影响的因素
1.操作符的优先级
2.操作符的结合性
3.是否控制求值顺序