变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换准寻以下规则:
1)若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
2)转换按数据长度增加的方向进行,以保证精度不降低。如 int型和long型运算时,先把int型转换为long型在进行运算。
3)所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再做运算。
4)char型和short型参与运算时,必须先转换为int型。
5)在赋值运算中,赋值号两边的数据类型不同时,赋值号右边量的类型将转换为左边的类型。
例:
#include
#include
void main()
{
float pi = 3.14159;
int s, r= 5;
s = r * r * pi;
printf("s = %d\n",s);
}
本程序中,pi为实型,s,r为整型。在执行rrpi中,r和pi都转换成了double型计算,结果也为double型,但由于s为整型,故赋值结果为整型,舍去了小数部分。
强制类型转换是通过类型转换运算来实现的。
其一般形式为:
(类型说明符)(表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如:
(float)a//把a转换为实型
(int)(x+y)//把x+y的结果转换为整型
在使用强制转换时应注意以下问题:
1)类型说明符合表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。
2)无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明是对改变量定义类型。
例:
#include
#include
void main()
{
float f = 5.75;
printf("(int)f=%d\nf=%f\n",(int)f,f);
}
本例表明,f虽强制转换为ing型,但只在运算中起作用,是临时的,而f本身的类型并不改变,因此(int)f的值为5(删去了小数)而f的值仍为5.75。
加法运算符 ‘+’;加法运算符为双目运算符,那应有两个量参与加法运算。如a+b,4+8.具有右结合性。
减法运算符‘-’;减法运算符为双目运算符。但“-”也可作为负值运算符,此时为单目运算,如 -x,-5等具有左结合性。
乘法运算符“*”;双目运算,具有左结合性。
除法运算符‘/’;双目运算具有左结合性,参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。
#include
#include
void main()
{
printf("%d,%d\n",20/7,-20/7);
printf("%d\n",100%3);
}