C语言程序设计-现代方法(笔记1)
第一章 C语言概述
1、C语言的历史(1.1)
起源:贝尔实验室开发的UNIX操作系统的副产品。标准化:C89和C99。基于C的语言:C++,Java,C#,Perl。
2、C语言的优缺点(1.2)
优点:高效、可移植、功能强大、灵活、标准库、与UNIX和Linux集成;缺点:C程序更容易隐藏错误、C程序可能难以理解、C程序可能会难以修改。
高效使用C的方法
1.学习如何规避C语言的缺陷(C陷阱与缺陷);2.使用软件工具使程序更加可靠(lint工具和调试工具);
3.利用现有的代码库;4.采用一套切合实际的编码规范;5.避免“投机取巧”和极度复杂的代码;6.紧贴标准(C89和C99)
第二章 C语言基本概念
1、编写一个简单的C程序(2.1):编译和连接
预处理:执行以#开头的命令,类似于编辑器,可以给程序添加内容,也可以对程序进行修改;
编译:编译器将程序翻译成机器语言(即目标代码);
链接:连接器把由编译器产生的目标代码和所需的其他附加代码整合在一起,附加代码包括库函数。
2、简单程序的一般形式(2.2):C程序由指令、函数和语句组成。
指令:一般是预处理器执行的命令,类似于#define,#include <stdio.h>;函数:程序员编写的函数和库函数;语句:程序运行时执行的命令,每条语句由分号结束。
main函数最后的return 0;语句。作用:一是使main函数终止,二是指出main函数返回值是0.
3、注释(2.3):每个程序都应该包含识别信息,即程序名,编写日期,作者,程序的用途及其他相关信息。/* */和//
4、变量和赋值(2.4)
每个变量必须有一个类型。使用变量之前必须对其进行声明。
float型变量运算比int型变量慢,float型变量所存储的数值只是实际值的一个近似值。
书写格式方面,建议在声明和语句之间留出一个空行。
给float型变量赋值时,最后在后面加一个f,例如float profit = 21.34f;
占位符%d用来指明在显示过程中变量的值的显示位置。
没有默认值且尚未在程序中被赋值的变量是未被初始化的。
C语言通用原则:在任何需要数值的地方,都可以使用具有相同类型的表达式。printf("Volume (cubic inches): %d\n", height * lenght * width);
5、读入输入(2.5)
printf中的字母f和scanf中的字母f含义相同,都是表示“格式化”的意思。
scanf函数需要知道将获得的输入数据的格式,而printf函数需要知道输出数据的显示格式。
6、定义常量的名字(2.6)
C程序规范:#define宏定义的名字都使用大写字母表示。
#define SCALE_FACTOR (5.0f / 9.0f) 添加上f
7、标识符(2.7)
传统C中命名中间插入下划线,例如symbol_table,current_page
目前流行的java(C#及C++)用单词首字母大写,例如symbolTable,currentPage
8、C程序书写规范(2.8)
语句可以分开放在任意多行内;记号间的加空格可以更容易区分记号;每个逗号后边也放一个空格;缩进帮助识别程序;空行可以把程序划分成逻辑单元;
第三章 格式化输入/输入
1、printf函数(3.1)
printf函数用来显示格式串的内容,并且在该串中的指定位置插入可能的值。格式串包括普通字符和转换说明。
转换说明:%m.pX格式或者-m.pX格式来表示。m(最小字段宽度):指定要显示的最小字符数量;p(精度),+和-表示右对齐和左对齐。
转义序列:使字符串包含一些特殊字符而不会使编译器引发问题。警报(响铃)符:\a;换行符:\n;水平制表符:\t。
2、scanf函数(3.2)
检查转换说明数量是否与输入变量数量相匹配;检查每个转换是否适合相对应的变量;scanf每个调用变量前需要有&。
许多专业程序员避免使用scanf函数,而是采用字符格式读取所有数据,然后再把他们转换成数值形式。
scanf函数本质上使一种“模式匹配”,试图吧输入的字符组与转换说明相匹配。
用户从键盘输入时,程序并没有读取输入,而是把用户的输入放在一个隐藏的缓冲区中,由scanf函数来读取。
第四章 表达式
1、算术运算符(4.1)
一元运算符什么都不做,在经典C中不存在这种运算符。
把int型操作数和float型操作数混合在一起时,运算结果时float型的。
运算符%要求操作数十整数。当运算符/和运算符%用于负操作数时,其结果难以确定。
通用规则,C语言允许在所有表达式中用圆括号进行分组。
运算符的左结合和右结合。
2、赋值运算符(4.2)
表达式v=e,如果v和e的类型不同,那么赋值运算发生时会把e的值转化为v的类型。
在C语言中,赋值就像+那样是运算符。即赋值操作产生结果。赋值表达式v=e的值就是赋值运算后v的值。
第五章 选择语句
1、逻辑表达式(5.1)
关系运算符可以用于比较整数和浮点数,也允许比较混合类型的操作数。因此1<2.5的值为1。
关系运算符的优先级低于算术运算符。表达式i + j < k - 1的意思是(i + j)<(k - 1)。判等运算符的优先级低于关系运算符。
逻辑运算符所产生的结果时0或1。
2、if语句(5.2)
把==运算符与=运算符相混淆是最常见的C语言编程错误。
复合语句,通过在一组语句周围放置花括号,可以强制编译器将其作为一条语句来处理。
对于if else 语句在不必要的情况下使用花括号有两个好处。首先,程序很容易修改,然后,可以避免忘记使用花括号而导致的错误。
条件表达式使程序更短小但也更难以阅读,所以最好避免使用。用于两种地方:1.return语句;2.某些类型的宏定义中。
if (i > j)
return i;
else
return j
替换为
return i > j ? i : J;
if (i > j)
printf("%d\n", i);
else
printf("%d\n", j);
替换为
printf("%d\n", i > j ? i : j);
为了便于理解,C89的程序员通常使用TRUE和FALSE这样的名字定义宏:
#define TRUE 1
#define FALSE 0
C99中使用_Bool型,例如:_Bool flag;_Bool只能赋值为0或1
或者包含<stdbool.h>,可以写为bool flag,<sdbool.h>中提供了ture和false两个宏,分别代表1和0.
第六章 循环
1、常见循环类型
while语句;do语句;for语句
2、for语句(6.3)
21.for语句的惯用法
从0向上加到n-1:for( i = 0; i < n; i++)
从1向上加到n:for( i = 1; i <= n; i++)
从n-1向下减到0:for(i = n - 1; i >= 0; i--)
从n向下减到1:for( i = n; i > 0; i--)
2.2 C99中的for语句
在C99中,在for语句的第一个表达式中可以替换为一个声明
for(int i = 0; i < n; i++)
2.3退出循环
break语句:跳出循环或者switch语句,但是不能从switch中跳出循环。
continue语句:跳过某次迭代的部分内容,但不会跳出整个循环。
goto语句:让程从一条语句跳转到另一条语句。goto语句必须和goto标识符在同一个函数中。
goto语句的缺点:1.goto语句可以往前跳也可以往后跳,使程序难以阅读;2.goto语句使程序难以修改。
2.4空语句
语句可以为空,除了末尾处的分号以外什么符合也没有。
空语句有一个好处:编写循环体的循环。
C程序员习惯性把空语句单独放置在一行。
for(d = 2; d < n && n & d != 0; d++)
;
其他使用空语句的地方
for(d = 2; d < n && n & d != 0; d++)
continue;
for(d = 2; d < n && n & d != 0; d++)
{}