C Primer Plus笔记
@[TOC]第一周笔记(第二章至第五章)
第二章
C语言基本结构
1、C语言六种语句:标号语句、复合语句、表达式语句(赋值语句)、选择语句、迭代语句、跳转语句。
2、C程序的基本模块是函数,一个程序包含一个或多个函数。且C程序一定是从main()函数处开始执行,而圆括号的作用是用于识别main()是一个函数。
3、注释:/ * 注释部分 * / ,/* */是一种注释方法,注释内容可以占据多行,而另外一种注释方式“//”只能单行注释。
4、C程序的函数体由花括号( {})进行标记不可用圆括号和方括号。
5、变量:所有变量必须先声明(为变量创建和标记储存空间)后使用,且变量命名时要使用有意义变量名或标识符,变量名可以用小写字母、大写字母、数字和下划线来命名,且名称的第一个字符必须是字符或下划线。
6、函数圆括号中的信息叫做参数,参数分实际参数(传递给函数的特定值),形式参数(函数中用于储存值的变量)。
7、return语句在main 函数中建议不要省略。
8、函数中一般用空行分隔概念上的多个部分。
函数调试
1、编译器中报错的位置比真正的错误位置滞后一行。
2、在一条声明中如果声明了多个变量,变量之间要用逗号隔开。
3、C语言的标识符不可使用关键字(下图)和一些保留标识符(包括以下划线字符开头的标识符和标准库函数名。
第三章
数据
1、C语言的数据类型关键字
K&R给出的关键字 | C90新添加 | C99添加 |
---|---|---|
int | signed | _Bool |
long | void | _Complex |
short | _ Imaginary | |
unsigned | ||
char | ||
float | ||
double |
2、数据类型的字节所占字长与机器字长有关,具体如下:
数据类型 | 16位编译器 | 32位编译器 | 64位编译器 |
---|---|---|---|
char | 1个字节 | 1个字节 | 1个字节 |
char*(指针变量) | 2个字节 | 4个字节 | 8个字节 |
short int | 2个字节 | 2个字节 | 2个字节 |
int | 2个字节 | 4个字节 | 4个字节 |
unsigned int | 2个字节 | 4个字节 | 4个字节 |
float | 4个字节 | 4个字节 | 4个字节 |
double | 8个字节 | 8个字节 | 8个字节 |
long | 4个字节 | 4个字节 | 8个字节 |
long long | 8个字节 | 8个字节 | 8个字节 |
unsigned long | 4个字节 | 4个字节 | 8个字节 |
但不管如何变化有几条原则必须遵循:
(1 )sizeof(short int)<=sizeof(int)
(2 )sizeof(int)<=sizeof(long int)
(3 )short int至少应为16位(2字节)
(4 )long int至少应为32位
3、数据类型分为两大基本类型:整数类型(不含小数点和指数的数)和浮点数类型(含小数)
4、计算机把浮点数分为小数部分和指数部分且浮点数可表示的范围比整数大。
基本数据类型
整型
1、int型(有符号整型):
(1)int类型的值必须是一个整数,可以是零、正整数、负整数,系统用一个特殊位的值表示有符号整数的正负号。
(2)IOS.C规定int的取值范围最小为-32768-32767
(3)0x或 0X的前缀表示十六进制,0的前缀表示八进制,例如十进制16用十六进制表示为0x10或0X10,用八进制表示为020。
(4)若输出十进制显示数则使用%d,显示八进制则使用%o,显示十六进制则使用%x;若显示八进制和十六进制的前缀0、0x、0X则分别使用%#o、%#x、%#X。
(5)其他整数类型中unsigned int或unsigned只能用于非负数值的场合,因为其用于表示符号位的位置现在用于表示另外一个二进制位,所以其取值范围为0~65535。
(6)打印u int型,使用%;打印long型,使用%ld;%lx表示以十六进制格式打印long型;%lo表示以八进制格式打印long型。C允许使用大写或小写的常量后缀,但是在转换说明中只能用小写。
(7)打印short类型使用h前缀,%hd表示以十进制显示short类型整数,%ho表示八进制显示short类型的整数。h和l前缀还可和u一起使用表示无符号型,%lu打印unsigned long类型,支持long long类型的系统%lld和%llu分别表示有符号和无符号。
2、char型(字符型)
(1)用数字编码处理字符,即char garde = 65;等价于char garde = ’A’;
(2)标准ASCII码的范围是0~127,所以只要7位二进制表示就好,所以char类型被定义为8位储存单元。
(3)转义序列
(4)最后两个转义序列(\0oo)和(\xhh)是ASCII码的特殊表示,beep= ‘\07’;等价于beep = ‘\07’;或’\7’;
3、_Bool类型:1表示ture,0表示false。
浮点型
1、float 、double、long double
(1)float类型至少精确表示6位有效数字(即至少精确而表示小数点后的6位有效数字),且取值范围至少是10-37~10+37。通常系统储存一个浮点数要占用32位,其中8位用于表示指数的值和符号,剩下的24位用于表示非指数的部分及其符号。
(2)double类型最小取值范围与float相同,但其至少要表示10位有效数字,且double占用64位而不是32位。
(3)浮点型常量的基本形式是:有符号的数字(包括小数点),后面紧跟e或E,最后一个有符号的数表示10的指数。例如:
-1.56E+12
1.52E-5
正好可以省略,可以没有小数点或者指数部分,但不能同时省略两者;可以省略小数部分,也可以省略整数部分,但是不能同时省略两者。
(4)不要在浮点型常量中间加空格。
(5)通常编译器默认假定的浮点型是double类型。若想覆盖可在浮点数后面加上F或f变为float型,加上l或L变为long double类型。
(6)打印浮点型时用%f转换说明打印十进制计数法的浮点数,使用%e打印指数计数法的浮点数。
(7)浮点数除了十进制计数法、指数计数法还有十六进制表示浮点数例如
0xa.1fp10 其中十六进制a表示十进制10,.1f是1/16加上12/256(十六进制f等于十进制15)p10是210,所以其表示的值是(10+1/16+15/256)*1024=10364.0。
第四章
字符串,数组
(1)字符串都被储存在char类型的数组中,字符串的结尾是“\0”,其ASCII码值为0,因此C语言用此标记字符串的结束。这就意味着数组的容量必须要比待储存的字符串中的字符数多1。
(2)数组的表示:char name [10]表示name数组有10个元素,且这十个元素的类型均为char型。
定义常量
(1)定义常量使用#define一般形式为:
#define+符号常量名+符号常量的值
语句末尾不用加分号。(一般的符号常量名要使用大写,这是C语言的一贯传统。
(2)符号常量的命名规则与变量的规则而相同。
printf()
(1)printf()打印数据时使用的转换说明:
(2)printf()函数打印时转换说明一定要与后面的每个项相匹配。
(3)printf()的转换说明修饰符:
(4)printf()中的标记:
(5)打印较长字符串的三种方法:
方法一:将一个printf()语句拆分成多个printf()语句,只要前一个语句不加“\n"下一个printf()语句将会打印再上一个语句后面。
方法二:使用反斜杠和回车键组合进行断行,将光标移至下一行开始处,在进行输入,但是切记不能就第二行首字母缩进,否则打印出的字符串也会出现缩进。回车之后光标在哪,就从哪里开始输入字符。
方法三:使用多个双引号将一个字符串分解成多个字符串,C编译器仍会将这多个字符串看作一个字符串。但是两个字符串之间要用空格隔开。例如
printf(“Hello world!”);等价于printf(“Hello” “world!”); 不可写为printf(“Hello”“world!”) 否则输出结果为Helloworld!而非Hello world!
scanf()
(1)如若scanf()直接读取基本变量类型的值,在变量名前加&,若是把字符串读入字符数组中则不需要使用&。
(2)scanf()转换说明:
(3)scanf()转换说明中的修饰符:
(4)scanf()的读取
a、scanf()会从第一个非零字符开始读取,读取其想要的字符,直到读到第一个它不匹配的字符为止,若第一个非零字符与其不匹配则其就不会读取任何字符。
b、如果使用字符宽度,scanf()会在字段结尾或第一个空白字符处停止读取(满足两者其一即可)
c、scanf()允许将普通字符放入格式字符串中,但是输入时必须将普通字符输入,否则无法读取。例如在两个转换说明中添加一个逗号,则输入时一定要有逗号。
第五章
基本运算符
赋值运算符
(1)“=”为赋值运算符,等号左边是一个变量名,等号的右边是一个值,“=”要做的就是将等号右边的值赋值给等号的左边。不可弄反。
加减法运算符
(1)+和-运算符都被称为二元运算符,即这些运算符需要两个运算对象才能完成。
(2)符号运算符-和+是一元运算符,只需要一个运算对象。
运算的优先级
圆括号的运算级最高越往下越低。
其他运算符
(1)“%”取模运算符
(2)“–”,“++”递增递减运算符
a、d++,d–,后缀使用,在使用d之后对d的值进行递增、递减运算。
b、++d,–d,前缀使用,在使用d之前对d的值进行递增、递减运算。
c、应避免一次使用多个递增或递减运算符,电脑运算会出现错误。
类型转换
(1)当类型转换出现在表达式中时,无论是unsigned还是signed的char和short都会被自动转换成 int,如有必要还会转换成unsigned int。类似于float自动转成double这种从小类型转换成大类型转换,被叫做升级。
(2)涉及两种类型的运算,两个值会被分别转换成两种类型的更高级别。
(3)类型级别由高到低依次为long double、double、float、unsigned long、long、long long、unsigned int、int。此外 当long与int大小相同时unsigned int比long的级别高。
(4)、在赋值表达式语句中计算的最终结果会被转变为被赋值变量的类型。此过程可能降级也可能升级。
(5)当被当做函数参数传递时,char和short被转换成被赋值变量的类型。