运算优先级和结合性
表达式有多种运算符混合使用时,求解表达式的值,首先要解决各种运算符的运算优先次序问题。即,优先级和结合性。
例如:下面表达式的值取决于5种运算符的优先次序。
优先级是指不同级别运算符之间的运算次序,先高后低,优先级共有15级。
分级的原则是:
1.
单目运算符的优先级高于双目运算符 双目运算符优先级高于三目运算符。
2.
在双目运算符中 算术运算符 高于 关系运算符 关系运算符 高于 逻辑运算符
3.
在位运算符中 移位运算符 高于 关系运算符
位逻辑运算符
低于 关系运算符
4.
园括号 运算符优先级最高 逗号运算符 优先级最低 赋值运算符 及 复合赋值
运算符 的优先级仅高于逗号运算符
结合性是指在一个表达式中有多个优先级相同的运算符之间的运算次序
右结合性
右 ---->左 单目 三目和赋值运算符
左结合性
左 ---->右 其余运算符
表达式与赋值中的自动类型转换
相同类型数据的运算结果,还是该类型。
不同类型数据的运算结果,是两种类型种取值范围大的那种
LONG DOUBLE>DOUBLE>FLOAT>LONG>INT>SHORT>CHAR
表达式与赋值中的自动类型转换
取值范围小的类型赋值给取值范围大的类型是安全的
反之是不安全的
若大类型的值在小类型能容纳的范围之内,则平安无事
但是浮点数转为整数,会丢失小数部分,而非四舍五入
反之转换后的结果必然是错误的,具体结果与机器和实现方式有关。
避免如此使用,好的编译器会发出警告。
#include<stdio.h>
#include<stdlib.h>
int main()
{int i = 5;float f = 73.2;char c = 'a';i = f;f = c;c = i;printf("i=%d\n", i);printf("f=%.2f\n", f);printf("c=%c\n", c);system("pause");
}
自动类型转换与强制类型转换运算符
强转(Casting)可以消除从大到小的警告
通过下面方式把表达式的值转为任意类型