测试环境:
VC6.0
1、求1/3 * 3
的值
示例代码如下:
#include <stdio.h>
void main(){
printf("%d\n",1/3*3);
}
运算结果是 0
,为什么是0呢?
1/3*3
表达式
先计算 1/3
,两边都是整型,其结果也是整型,所以 1/3
结果为0
,接着计算0*3
,两边都是整型,其结果为也为整型,结果为0,最后以%d
格式化输出,所以输出结果为0
2、求1.0/3 * 3
的值
示例代码如下:
#include <stdio.h>
void main(){
printf("%lf\n",1.0/3*3);
}
运算结果是 1.000000
,为什么是1.000000
呢?
先计算 1.0/3
,1.0为浮点型,3为整型,两边的数据类型不同,那如何计算呢。
在C语言中,不同数据类型的混合运算遵循以下原则:
1、若参与运算量的类型不同,则先转换成同一类型,然后进行运算
2、转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算
3、所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算
4、char型和short型参与运算时,必须先转换成int型
1.0
是浮点型数据类型,在运算过程中,会转换成双精度浮点数据,3
是整型,运算符两边的数据类型要一致,且往数据长度增加的方向进行,以保证精度不降低。所以,整数3会转化为双精度的浮点类型,结果也为双精度的数据类型,结果为0.333...
,接着0.333...
和整数3
相乘 ,其结果应该为双精度的数据类型,按道理来说就是 0.999...
那么为何会输出1.00000
简单证明:
0.999... = 1
分数法
0.333... = 1/3
3*0.333... = 3*1/3 = 1
0.999... = 1
代数法
c = 0.999...
10c = 9.999...
10c-c= 9.999... - 0.999...
9c=9
c=1
所以,1.0/3 * 3
的运算结果为1.000000
(其结果数据类型为双精度,默认输出6位小数)
3、求3/2
的值
其值为1
,这里就不再分析了,根据上面两个例题,相信你可以很容易就分析出来
示例代码如下:
#include <stdio.h>
void main(){
printf("%d\n",3/2);
}
注:这里有一个需要注意的问题,使用printf
语句打印的时候,格式化数据类型要正确,比如 3/2
的结果是整形,那么请以%d
的格式输出。
这里留一个小疑问,如果3/2
以%f
的格式输出,其结果又是什么呢?我们将在下一个文章讨论这个问题。