表达式求值的顺序一部分是由操作符的优先级和结合性决定,同样,有些表达式的操作数在求值的过程中可能需要准换为其它类型。
隐式类型转换:C的整型算术运算总是至少以缺省类型的精度来进行的,为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整形,这种转换称为整形提升。
如:char a,b,c; a=b+c;b和c的值被提升为普通整形,然后在执行加法运算。
加法运算完成之后,结果将被截断,然后在存储于a中。
如:a=(~a^b<<1)>>1;
在求补和左移操作时,8位的精度是不够的,标准要求进行完整的整型求值,所以对于这类表达式的结果,是不会存在歧义的,所以我们不用进行整形提升。
算术转换:如果某个操作数的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行 。
操作符的属性:复杂表达式的求值应该遵循这三个规则,造作符的优先级,操作符的结合性,是否控制求值顺序。两个相邻的操作符先执行哪个,取决于他们的优先级,如果两者的优先级相同,则取决于他们的结合性。
我们不能写出依赖求值顺序的表达式,这样的表达式是不可移植的,比如说,我们不能写出这样的表达式,c+--c,因为我们没有办法知道,+操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的。
我们不能写出依赖求值顺序的表达式,这样的表达式是不可移植的,是有歧义的。
int:默认是有符号的。