5.2 基本运算符
基本算术运算的运算符: =、 +、 -、 *和/
C 没有指数运算符。不过, C 的标准数学库提供了一个pow()函数用于指数运算。 例如, pow(3.5,
2.2)返回3.5的2.2次幂) 。
C使用符号/来表示除法。 /左侧的值是被除数, 右侧的值是除数。 例如, 下面four的值是4.0:
four = 12.0/3.0;
整数除法和浮点数除法不同。 浮点数除法的结果是浮点数, 而整数除法的结果是整数。 整数是没有小数部分的数。 这使得5除以3很让人头痛, 因为实际结果有小数部分。 在C语言中, 整数除法结果的小数部分被丢弃, 这一过程被称为截断(truncation) 。
运行程序清单5.6中的程序, 看看截断的情况, 体会整数除法和浮点数除法的区别。
/* divide.c -- 演示除法 */
#include <stdio.h>
int main(void)
{
printf("integer division: 5/4 is %d \n", 5 / 4);
printf("integer division: 6/3 is %d \n", 6 / 3);
printf("integer division: 7/4 is %d \n", 7 / 4);
printf("floating division: 7./4. is %1.2f \n", 7. / 4.);
printf("mixed division: 7./4 is %1.2f \n", 7. / 4);
return 0;
}
程序清单5.6中包含一个“混合类型”的示例, 即浮点值除以整型值。 C相对其他一些语言而言, 在类型管理上比较宽容。 尽管如此, 一般情况下还是要避免使用混合类型。 该程序的输出如下:
integer division: 5/4 is 1
integer division: 6/3 is 2
integer division: 7/4 is 1
floating division: 7./4. is 1.75
mixed division: 7./4 is 1.75
注意, 整数除法会截断计算结果的小数部分(丢弃整个小数部分) , 不会四舍五入结果。 混合整数和浮点数计算的结果是浮点数。 实际上, 计算机不能真正用浮点数除以整数, 编译器会把两个运算对象转换成相同的类型。
本例中, 在进行除法运算前, 整数会被转换成浮点数。
在C99以前,不同的实现采用不同的方法。 但是C99规定使用趋零截断。 所以, 应把-3.8转换成-3
5.3.1 sizeof运算符和size_t类型
sizeof运算符以字节为单位返回运算对象的大小(在C中, 1字节定义为char类型占用的空间大小。 过去, 1字节通常是8位, 但是一些字符集可能使用更大的字节) 。 运算对象可以是具体的数据对象(如, 变量名) 或类型。 如果运算对象是类型(如,float) , 则必须用圆括号将其括起来。
// sizeof.c -- 使用sizeof运算符
// 使用C99新增的%zd转换说明 -- 如果编译器不支持%zd, 请将其改成%u或%lu
#include <stdio.h>
int main(void)
{
int n = 0;
size_t intsize;
intsize = sizeof (int);
printf("n = %d, n has %zd bytes; all ints have %zdbytes.\n",
n, sizeof n, intsize);
C语言规定, sizeof 返回 size_t 类型的值。 这是一个无符号整数类型,但它不是新类型。size_t是语言定义的标准类型。 C有一个typedef机制, 允许程序员为现有类型创建别名。 例如,
typedef double real;
这样, real就是double的别名。 现在, 可以声明一个real类型的变量:
real deal; // 使用typedef
编译器查看real时会发现, 在typedef声明中real已成为double的别名, 于是把deal创建为double 类型的变量。
类似地, C 头文件系统可以使用 typedef把 size_t 作为 unsigned int 或unsigned long的别名。
这样, 在使用size_t类型时, 编译器会根据不同的系统替换标准类型。
C99 做了进一步调整, 新增了%zd 转换说明用于 printf()显示 size_t 类型的值。 如果系统不支持%zd, 可使用%u或%lu代替%zd。
5.3.2 求模运算符: %
例如, 13 % 5(读作“13求模5”)得3
求模运算符只能用于整数, 不能用于浮点数。
min = sec