《C程序设计语言(第2版·新版)》第1章 导言
实例和基本概念介绍。
1.1 入门
例1:打印hello world
(UNIX:建立hello.c;通过命令cc hello.c编译得到可执行文件a.out;执行a.out即可打印出。不同OS编译、加载、运行规则有所不同。)
每个程序必须在某个位置包含一个main函数;每个程序都从main的起点开始执行;main(ps:可有两个参数argc,argv)(ps:?C的main 输出可无int,C++必须int,也可能跟编译器有关);可函数调用(库函数或自编函数)
"hello world\n"是字符串常量,可作为printf(不会自动换行)的输入参数;
\n, \t, \b, \", \\都是转义字符(习题ps:\后可加3位八进制数字;加有些字符则是未定义的);
1.2 变量与算术表达式
注释:包含在之间,不能嵌套,编译忽略(ps:ANSI C 称作C89;C99标准增加行注释//)
声明:类型名+变量表;C中所有变量必须先声明后使用;
循环体是单语句则可不加括号;
建议:每行一条语句,运算符两边加空格;
printf()格式化输出,=表示占三个数字宽并且右对齐;
浮点数打印宽度与精度:%6表示至少6字符宽;%.2表示打印两位小数(宽度不限);%3.0表示浮点数至少占3个字符宽且不带小数部分;%6.1类似;都是右对齐
算术运算符的操作数均为整型则执行整型运算,若有一个浮点型则整型会被转换为浮点型;常数带小数点表示是浮点型;5/9=0, 5.0/9结果是浮点数:C及许多语言中整数除法会执行舍位(舍弃小数部分);
建议:浮点常量取整数,书写时也加小数点。如9.0
1.3 for循环
C中一个通用规则:使用某种类型变量值的场合总可以使用该类型的表达式,如%6.1匹配的浮点值,如for后括弧里的三条语句;
1.4 符号常量
#define 名字 替换文本
名字形式与变量相同,通常建议采用大写与变量区分;替换文本可以是任何字符序列;末尾无分号;名字不定义之后出现名字(不在引号内;不是其他名字的一部分)处都被替换;
1.5 字符输入/输出
标准库的I/O模型:无论文本从何处I/O,都按字符流处理;提供一次读/写一个字符的函数,如getchar和putchar:
c=getchar();//从文本流读入下一个输入字符(通常来自键盘)并将其返回;int c可存储字符型并且范围足够大;返回EOF(定义在中的符号常量,不同于任何char类型的一个整型数)表示文件结束;
类似上述赋值语句是一个表达式,具有一个值,可放入其他表达式如(c=getchar())!=EOF;
putchar(c);//将整型变量c以字符形式打印(通常屏幕显示)
putchar可与printf交替调用,输出与调用次序相同;
++n;更简练且通常效率更高;%ld用于输出long型;若long不够可将n声明为double,输出%.0f;
注意:要考虑特殊情况(边界条件),比如循环初始判定就为假,那么仍应输出正确结果;
字符常量:单引号字符,值等于机器字符集中对应数值,实质是小整型数另一写法;例如ASCII中'A'值为65;'\n'(是单个字符)为10但使用'A'可与字符集无关,比使用65好;
赋值语句a=b=c=1;等价于a=(b=(c=1)),即赋值结合是从右至左;
&&比||优先级高一级,它们连接的表达式从左往右求值,得到最终结果即终止求值,有时这很必要;
1.6 数组
int ndigit[10]包含ndigit[0]到ndigit[9]十个元素;[]内可是任何整型表达式;
1.7 函数
函数定义一般形式:
返回值类型 函数名(0个或多个参数声明)
{
声明部分
语句部分
}
return 任何表达式;可不带表达式,控制权交给调用者;主调函数也可忽略返回值;
一般main返回0表示正常终止,非0则表示异常或出错;程序要向其执行环境返回状态;
函数原型:main之前的声明语句,必须与定义一致,可忽略参数名;编译器据此检测函数调用中参数数目与类型是否错误;
1.8 参数-传值调用
C传递给调用参数的值存在临时变量(本地/私有副本)里而非在原变量中,这不同于Fortran或Pascal;C被调函数不能直接修改主调函数中的变量值,只能修改起私有副本中的值;欲修改则须用指针;数组名作为参数,并不复制数组,传入的是起始元素的地址,可通过下标访问或修改数组元素的值;
1.9 字符数组
函数默认返回类型是int,可省略;原始C语言中函数原型可不写输入参数;
调用字符数组:
int getline(char s[], int lim)
void copy(char to[], char from[])
C语言中字符串常量存储时末尾加'\0'标志,%s格式规范要求必须此形式
1.10 外部变量与作用域
函数的局部变量(即自动变量)不能被其他函数直接访问,函数执行完毕退出时消失(特例:static存储类局部变量在多次函数调用之间值不变);自动变量未赋值时存的是无效值;
外部变量:定义在所有函数外部,只能定义一次,可在全局范围内访问;函数可借此交换数据而不必用参数表;在程序执行期间一直存在;
声明变量类型,编译器将为它们分配存储单元;
函数使用外部变量前,(我的理解)若外部变量定义出现在该函数后或其他源文件中,则需使用extern(加在int 等前面)声明;否则可省略;
通常把变量和函数的extern声明放在一个单独的头文件中,并在每个源文件开头#include;
copy()这样的声明被看成老式声明,参数表将不做任何检查;ANSI C规定若需声明空参数表则须显式声明:void copy(void);
“定义”与“声明”:前者创建变量或分配存储单元,后者只是说明变量性质,不分配存储单元;
建议:外部变量不要滥用,会使得数据关系混乱,以及降低某些函数的通用性