头文件 <string.h>定义了一组与字符集(不管是 asc II字符集还是 EBCDIC字符集)无关的测试与转换函数。例如 tolower(c) 将c 转换为小写形式(如果c 是大写的话),又例如测试语句 c >= '0' && c <= '9' 可以使用库函数 isdigit(c) 来代替
在 if 、while 、for 语句的测试条件中,“非 0” 意味着真
一般来说,数学函数 (如在标准头文件 中定义的函数) 使用双精度(double )类型的变量。
使用float 主要是为了在使用较大的数组时节省存储空间,有时也为了节省机器执行时间(双精度运算特别费时)
赋值时也要进行类型转换,赋值运算符右边的表达式的值需要转换为左边变量的类型。这个时候如果右边是“较高”的类型,而左边是“较低”的类型,那么可能会出现“数据的损失”.
在函数调用的时候,编译器将对实参进行自动强制类型转换
强制类型转换 : (类型名)表达式 例如库函数 sqrt的参数为double 类型
int n;
sqrt((double)n);
在上例中,强制类型转换只是生成一个由 n 转换后的double的值,n本身的值并没有改变。
对于 习题 2-3 ,习题集中的解答十分的精炼和高效,有 标准库函数实现的风格, 非常值得看一下。
前置++和后置++
如果n 的值是5 ,则
A 表达式 x = n++; 执行后的结果: x 的值是 5, n的值是 6
B 表达式 x = ++n; 执行后的结果: x 的值是 6, n的值是 6
自增与自减运算符只能作用于变量。 类似于 (i + j)++ 之类的表达式是非法的
在 vc 编译器中, 函数中变量的声明一定要放在该函数体的最前面,否则编译报错。
c 语言中提供了6 个按位操作运算符,这些运算符只能作用于整形操作数,即只能作用于无符号或者带符号的char、short、int 与 long 类型。 这六个位操作符是 & | ^ << >> ~
m *= n +1; 的含义是 m = m * (n + 1) ,而不是 m = m * n +1; 很好理解,因为赋值运算符 *= 的优先级低于 算术运算符 +
赋值表达式的类型是他的左操作数的类型,其值是赋值操作完成后左操作数的值(之所以不说是其赋值运算符右边的表达式的值,因为有可能发生类型转换)