第一章 导言
第一章带领大家进入了C语言的世界,但是我感觉,如果没有一些基础,要想完全理解这一章的内容,还是有些困难的。
在允许使用某种类型变量值的任何场合,都可以使用该类型的更复杂的表达式。无论文本从何处输入,输出到何处,其输入/输出都是按照字符流的方式处理。文本流是由多行字符构成的字符序列,而每行字符则由0个或多个字符组成,行末是一个换行符。
当把数组名用作参数时,传递给函数的值是数组起始元素的位置或地址-它并不复制数组元素本身。在被调用函数中,可以通过数组下标访问或修改数组元素的值。可以使用const来声明该数组不能够被修改。
第二章 类型、运算符与表达式
变量和常量是程序处理的两种基本数据对象。声明语句说明变量的名字及类型,也可以指定变量的初值。运算符指定将要进行的操作。表达式则把变量和常量组合起来生成新的值。
变量命名的限制:名字是由字母和数字组成的序列,但其第一个字符必须为字母。下划线“_”被看作是字母,通常用于命名较长的变量名,以提高其可读性。大写字母和小写字母是有区别的。在传统的C语言语法中,变量名使用小写字母,符号常量名全部使用大写字母。
默认情况下,外部变量与静态变量将被初始化为0.未经显式初始化的自动变量的值为未定义值(即无效值)。C语言中的基本数据类型:char(字符型)、int(整型)、float(单精度浮点型)、double(双精度浮点型)。
基本数据类型的限定符:short、long、signed、unsigned、const。
任何变量的声明都可以使用const限定符限定。该限定符指定的变量不能被修改。对数组而言,const限定符指定数组所有元素的值都不能被修改。
所有的变量都必须先声明后使用。
ANSI标准库
标准库中的函数、类型以及宏分别在下面的标准头文件中定义:
<assert.h> <float.h> <math.h> <stdarg.h> <stdlib.h> <ctype.h> <limitf.h> <setjmp.h> <stddef.h> <string.h> <errno.h> <locale.h> <signal.h> <stdio.h> <time.h>
常量:各种数据类型都可以有对应的常量。整数的常量可以有多种表现类型,可以是十进制表示、八进制表示、十六进制表示。一个字符常量就是一个整数。常量表达式是仅仅只包含常量的表达式。枚举是另外一种类型的常量。枚举是一个常量整型值列表。他的优势在于常量值可以自动生成。
类型转换:
一般来说,自动转换是指把“比较窄的”操作数转换为“比较宽的”操作数,并且不丢失信息。将字符类型转换为整型时,C语言没有指定Char类型的变量是无符号变量(unsigned)还是带符号变量(signed)。
C语言中,很多情况下会进行隐式的算数类型转换。一般来说,如果二元运算符的两个操作数具有不同类型,那么在进行运算之前先要把“较低”的类型提升为“较高”的类型。运算的结果为“较高”的类型。
一般来说,数学函数使用双精度类型的变量。使用float类型主要是为了在使用较大数组时节省存储空间,有时也为了节省机器执行时间(双精度算术运算特别费时)。
赋值时也要进行类型转换。赋值运算符右边的值需要转换为左边变量的类型,左边变量的类型即赋值表达式结果的类型。
当把较长的整数转换为较短的整数或char类型时,超出的高位部分将会被丢弃。
由于函数调用的参数是表达式,所以把参数传递给函数时也可能进行类型转换。
在任何表达式中都可以使用强制类型转换的一元运算符进行显式类型转换:(类型名)表达式。
自增运算符与自减运算符、按位运算符、赋值运算符、条件表达式都比较简单,就不记录了。
运算符的优先级与求值次序非常有趣。有一个需要特别注意的问题:C语言没有指定同一运算符中多个操作数的计算顺序。例如:
printf(“%d %d\n”, ++n power(2,n) ) 这种使用方式在不同机器上的表现是不一致的,因此要借助中间变量来保证运算的正确性。
屏蔽码是多个111111,在位的运算中有重要作用。用屏蔽码进行异或操作,可以对位取反;用屏蔽码进行与操作,可以取出对应的位;用屏蔽码进行或操作,可以保持原始的值不变。
按位与运算符&经常用于屏蔽某些二进制位;
按位或运算符|常用于将某些二进制位置为1;
按位异或运算符^当两个操作数的对应位不相同时将该位置置为1.
一元运算符~用于求整数的二进制反码;
第三章 控制流
程序语言中的控制流语句用语控制各计算操作执行的顺序。
语句和程序块的区别。表达式加上分号(;)之后,就成为了一条语句。右花括号用于结束程序块,其后不需要分号。
条件判定(If … else if … )、多路判定( switch )、while 循环和 for 循环、break 和 continue、goto 和标号 构成了C语言中全部的控制流。
第四章 函数与程序结构
C语言在设计中考虑了函数的高效性和易用性这两个因素。
如果函数定义中省略了返回值类型,则默认为int类型。程序可以看成是变量定义和函数定义的集合。函数之间的通信可以通过参数、函数返回值以及外部变量进行。
如果函数没有原型,则函数将在第一次出现的表达式中被隐式的声明,该函数的返回值被假定为 int 类型,但上下文并不对其参数做任何假设。
对空参数列表的特殊处理是为了是新的编译器能够编译比较老的C语言程序,不过,在新编写的程序中,这么做是不提倡的。
C语言可以看作是由一系列的外部对象构成,这些外部对象可能是参数或函数。由于C语言中不允许在函数内部定义其他函数,因此函数本身是“外部的”。
默认情况下,外部变量与函数具有下列性质:通过同一个名字对外部变量的所有引用(即使这种引用来自单独编译的不同函数),实际上都是引用同一个对象(标准中把这一性质称为外部链接)。
外部变量的用途还表现在它们与内部变量相比具有更大的作用域和更长的生存期。
第五章 指针与数组
指针是一种保存变量地址的变量。C语言中,指针的使用非常广泛,原因:指针常常是表达某个计算的唯一途径;同其他方法比较起来,使用指针可以生成更高效、更紧凑的代码。