在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,小数点之后的部份被自动消去了,这是因为number
是int
整数,而除数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。