3.4 算术运算符与算术表达式
算术运算符主要用于进行简单的算术运算。C语言中,算术运算以算术表达式的形式出现。C语言除了提供简单的加减乘除四则运算符外,还提供了模除(%)、自增(++)和自减(--)等几种特殊的算术运算符。
3.4.1 算术运算符与数据类型
C语言中,除运算符用/代替,乘运算符用*代替,并且*不能省略(如x*y不能省略为xy)。由于受到计算机硬件和操作系统性能影响,算术运算并不能完全和数学运算相匹配。例如在进行除(/)运算时,需考虑操作对象的数据类型。
范例3.4 ComputeOperatorType.c
ComputeOperatorType.c程序使用输出函数printf验证两种不同数据类型进行算术除操作的结果,分析浮点型数据作算术运算的精度。(光盘\chat3\ ComputeOperatorType.c)
01 #include<stdio.h> 02 main() 03 { 04 printf("%f\n",1/2); 05 printf("%f\n",1.0/2); 06 }
这是一个非常简单的输出算术表达式值的程序。程序第4行中,输出表达式1/2的值,使用浮点输出格式%f。在数学计算中,1/2的值为0.5,但C语言中却输出0.000000的结果。造成这种输出的原因是C语言中,两个整型量作算术运算,其结果仍为整型,因此程序执行过程中,首先进行1/2的除运算,得商0.500000,然后取结果中的整数部分0,并以浮点形式输出,结果为0.000000。这是程序初学者比较容易犯的错误,也是程序员经常忽略的一个知识点。
程序第5行的操作避免了这种情况的发生,程序将整数1改为实型常量1.0。C语言规定,当两种不同类型的数据进行运算时,系统自动将精度较低的一个转化为精度较高的类型,结果为高精度类型。因此,程序第5行中,1.0/2的执行过程为:先将常量2转化为实型常量2.0,然后与1.0进行除运算,得商0.500000。
程序运行输出结果为:
0.000000
0.500000
另外一种方式是对某一对象进行强制类型转换。例如可将程序第4行改为:
printf("%f\n",(float)1/2);
有关强制类型转换将在后续章节介绍。
作者心得:
不能将程序第4行改为:printf("%f\n", (float)(1/2));这样仍然得不到正确结果,因为这样的强制类型转换是对商作转换,因而结果仍然是0.000000。同时注意0不能作为除数,否则程序运行时将崩溃。