整形提升
说明:C的整型算术运算总是至少以缺省整型类型的精度来计算的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
int main()
{
char a, b, c;
...
a = b + c;
return 0;
}
b和c的值被提升为普通整型,然后再执行加法运算。 加法运算完成后,结果将被截断,然后再储存于a中。并且,整型提升是按照变量的数据类型的符号位来提升的,无符号整型提升,高位直接补0。
示例:
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
输出结果:1 4 4 因为+c和-c是一个表达式,经过了整型提升。
操作符的优先级
说明:从上到下优先级依次降低。
问题表达式
此外还有一些问题表达式要注意,不要写错
问题表达式1:
int main()
{
a* b + c * d + e * f;//问题表达式
c+ --c;//问题表达式
return 0;
}
a,b,c可能是三个表达式,执行的顺序可能会影响a,b,c本身的值。因此(a*b)+(c*d)+(e*f)不等于(a*b+c*d)+e*f。但是以上顺序在该表达式中都是允许的,因此,该表达式是问题表达式。
问题表达式2:
int main()
{
int a = 1;
int b = (++a) + (++a) + (++a);
printf("%d\n", b);
return 0;
}
先算三个++a再求和与先算前两个++a并求和的结果是不同的。
所以,尽可能简化表达式,避免出现问题表达式。