算术运算、类型转换


在 C 中提供与算术相关的 加(+)、减(-)、乘(*)、除(/)的运算符,另外还有一个也常用的余除运算符(%)或称模数(Modulus)运算符,这类以数学运算为主的运算符,称之为算术运算符(Arithmetic operator)。

这类运算符的使用,基本上由左而右进行运算,遇到加减乘除的顺序问题时,也是先乘除后加减,必要时加上括号表示运算的先后顺序,例如这个代码会在控制台显示7:

printf("%d\n", 1 + 2 * 3);

编译器在读取代码时,是由左往右读取的,而初学者往往会犯一个错误,例如(1 + 2 + 3) / 4,由于我们习惯将分子写在上面,而分母写在下面的方式,使得初学者往往将之写成了:

printf("%d\n", 1 + 2 + 3 / 4);

这个程序事实上会是1 + 2 + (3 / 4),为了避免这样的错误,在必要的时候可为表达式加上括号。例如:

printf("%d\n", (1 + 2 + 3) / 4);

%运算符是余除运算符 它计算除法后的余数,一个例子是,假设有个乱数产生函数为rand(),可以产生正整数乱数,而你却不知道它的最大范围是多少,这时可以如下产生 0 到 99 的乱数:

printf("%d\n", rand() % 100);

也可以利用%来作循环计数之用,例如由 0 计数至 9 不断循环:

counter = (counter + 1) % 10;

算术运算符使用不难,但要注意类型转换的问题,请你先看看这段程序会印出什么结果?

int number = 10; 
printf("%d\n", number / 3);

答案不是 3.333333,而是 3,小数点之后的部份被自动消去了,这是因为numberint整数,而除数 3 也是int整数,运算出来的程序被自动转换为int整数了,而为了正确的显示运算的整数结果,还要使用%d格式指定字, 那下面这个程序呢?

double number = 10.0;
printf("%f\n", number / 3);

这个程序的结果会是 3.3333,而为了正确的显示运算的整数结果,使用了%f格式指定字,这是 C 的隐式类型转换(Implicit type conversion),在一个类型混杂的表达式中,长度较长的数据类型会成为目标类型,较小的类型会自动提升为目标类型,因而在上例中3会被提升为 3.0 再进行运算,结果就可以显示无误,这样的转换又称算术转换(Arithmetic conversion)。

除了注意隐式类型转换的问题,运算结果输出时,还必须搭配格式指定字,才可以正确的显示最后运算的结果。

在一个指定的动作中,左边的数值会成为目标类型,当右边的数值类型比左边的数值类型长度小时,右边的数值会自动提升为目标类型,例如:

int num = 10;
double number = num;

在上例中,number的值最后会是 10.0,在指定的动作时,如果右边的数值类型比左边的数值类型类型长度大时,超出可存储范围的部份会被自动消去,例如将浮点数指定给整数变量,则小数的部份会被自动消去,例子如下,num最后的结果会是 3 而不是 3.14,而为了显示正确的整数结果,输出时要指定格式指定字%d

int num = 0;
double number = 3.14;
num = number; 
printf("%d\n", num);

在两个整数类型相除时,也可以进行类型转换,将其中一个类型转换至double类型再进行运算,例如:

int number = 10;
printf("%f\n", (double) number / 3);

上例中结果会显示 3.3333。


展开阅读全文