第七章 基本类型
1、整数类型(7.1)
有符号整数如果为正数或零,那么最左边的位(符号位)为0;如果是负数,则符号位为1.
默认情况下,C语言中的整型变量都是有符号的。
十进制常量包含0-9的数字,但不能以零开头;八进制常量只包含0-7,必须要以零开头;十六进制常量包含0-9数字和a-f字母,并且总以0x开头。
为了强制编译器把常量作为长整数来处理,需在后面加字母L(或l),例如:15L,0x7fffL.
为了指明是无符号常量,可以在常量后面加字母U(或u),例如:15U,0x7fffU.
有符号整数溢出,程序行为是未定义的;无符号整数溢出,结果是有定义的:一般是0。
2、浮点类型(7.2)
C语言提供三种浮点类型:float(单精度浮点数),double(双精度浮点数),long double(扩展精度浮点数)。float和double对于大部分程序都够用。
float精度为6个数字,double精度为15个数字。浮点常量必须包含小数点或指数,例如:57.0,5.7e+1。
3、字符类型(7.3)
在C中,字符和整数之间的关联非常强,字符常量事实上是int类型而不是char类型。
有符号(signed)字符取值范围:-128-127;无符号(unsigned)字符取值范围:0-255。
可移植性技巧:不要假设char类型默认为signed或unsigned。如果有区别,用signed char 或unsigned char代替char.。
转义序列共有两种:字符转义序列和数字转义序列。字符转义序列,例如:\a,\n,\t等。数字转义序列,例如:\x1b,\033等。
字符处理函数:小写字符转换成大写字母,ch = toupper(ch),需要包含#include <ctype.h>
用scanf和printf函数也能读/写字符:
do { scanf("%c",&ch); } while (ch != '\n')
getchar()返回的是一个int类型值,而不是char类型值。getchar()的惯用法。第一个用于检测是不是换行符,第二个用于检测空格。
while (getchar() != '\n') ; while ((ch = getchar()) == ' ') ;
4、类型转换(7.4)
当算术表达式或逻辑表达式中操作数的类型不相同时;当赋值运算符右侧表达式的类型和左侧变量的类型不匹配时;当函数调用中的实参类型与其对应的形参类型不匹配时;当return语句中表达式的类型和函数返回值的类型不匹配时。
任一操作数的类型是浮点类型,需要将float提升为double;两个操作数类型都不是浮点类型,需要将int提升为unsigned int或long int。
C语言会把赋值运算右边的表达式转换成左边变量的类型。
强制类型转换:(float)dividend / divisior;将变量dividend强制转换为float,编译器也会将divisior转换为float类型。
5、类型定义(7.5)
使用typedef对类型进行定义,例如,typedef int Bool;
类型定义更加易于理解,类型定义可以更好的编写可移植的程序。
可以移植性的技巧:为了更大可移植性,可以考虑使用typedef定义新的整数类型名。
6、sizeof运算符(7.6)
sizeof (类型名),返回的值是一个无符号整数,代表存储类型名的值所需的字节数。
sizeof也可以用于常量,变量和表达式,比如sizeof(i+j)
第八章 数组
1、一维数组(8.1)
数组是含有多个数据值的数据结构,并且每个数据值具有相同的数据类型。
数组常见操作
for (i = 0; i < N; i++) a[i] = 0; //初始化数组 for (i = 0; i < N; i++) scanf("%d", &a[i]); //将数据读入数组 for (i = 0; i < N; i++) sum += a[i]; //对数组中元素求和
数组初始化:int a[10] ={0};初始化完全为空是非法的,所以要在大括号内放一个0,其他值会默认初始化为0。
C99中指定初始化:int a[15] = { [2] = 29, [9] = 7, [14] =48}
可以用sizeof计算数组元素的大小,比如数组是a[10],用数组的大小除以数组元素的大小:sizeof(a) / sizeof(a[0])
数组赋值除了用下面的方法,也可以用memcpy函数进行赋值,需要将头文件string.h包含,一般memcpy比较高效。
for (i = 0; i < N; i++) a[i] = b[i];
2、多维数组(8.2)
C语言中的数组是按照行主序存储的,也就是从第0行开始,接着第1行,以此类推。
多维数组不建议省略掉内层的花括号。
常量数组(声明前加const)好处:首先,表明程序不会改变数组(方便别人阅读程序),然后,有助于编译器发现错误(告诉编译器不会修改)。
变长数组优点:程序员不必再构造数组时给定一个长度,程序可以在执行时计算所需元素个数。
变长数组限制:没有静态存储限制,没有初始化。
第九章 函数