第一章 概览
1.C简介
C是为编程人员开发的语言,面向编程人员的需要。
C语言的优点和缺点是同一特征的两个方面,即C语言给予程序员更多的自由,但同时也让程序员承担更大的风险。C在表达方面的自由会增加风险,意味着程序员可能会因此犯难以追踪的错误。
自由的代价是永远的警惕。
2.使用C语言的7个步骤
①定义程序目标 ②设计程序 ③编写代码 ④编译 ⑤运行程序
⑥测试和调式程序 ⑦维护和修改程序
3.编程机制
源代码→编译器→目标代码(.obj)→链接器→可执行代码(.exe)
/↓ ↓\
库代码 启动代码
编译器:将源代码转换为中间代码
链接器:将中间代码与其它代码相结合来生成可执行文件
第二章 C语言概述
1.C程序必须使用英文输入法输入符号,尤其注意;和“”和,
2.运算符:=
num= 7; //(注释)将值7赋给变量num,变量num的值变为7。
3.printf()函数
例:printf(“Iam %d years old.\n”,num);
printf()表示是一个函数
“”内的是函数需要使用的值,即参数
%d是一个占位符(格式说明符),指出变量num输出的位置
4.使程序可读的技巧
让程序具有可读性,使程序更易于阅读和理解,有利于更正、修改,也有助于让自己对程序要做的事情有更清晰的概念。
①选择有意义的变量名和使用注释
②使用空行分隔一个函数的概念上的多个部分
③每个语句用一行
5.关键字
关键字是C语言中的词汇。不能将关键字作为变量名。
第三章 数据和C
1.变量与常量
数据:承载信息的数字和字符
常量:数据在程序使用之前预先设定,并在整个程序运行过程中没有变化。
变量:数据在程序运行过程中可能变化或被赋予新的值
2.变量声明、变量初始化
声明: 变量类型 变量名;
初始化:①变量名=值;②变量类型变量名=值;
例:int num =12; har c = ‘A’;float num2 = 3.3;
变量名:只能字母或下划线(_)开头,首字符后面可以使用大小写字母、数字和下划线
3.数据类型
①int型(整型)
值必须为整数,如:-4,32,0,...
格式说明符:%d(十进制)、%0(八进制)、%x(十六进制)
shortint:表示不大于int位长度的数,%hd
longint:表示不小于int位长度(至少32位)的数,%ld
unsignedint,unsigned long int,unsigned short:表示无符号的整数,即正整数或0,%u,%lu,%hu
②char型(字符型)
值必须为单个字符,如’a’,’2’,’#’,...
格式说明符:%c(用%d可打印字符对应的ASCII整数值)
非打印字符:
(1)赋相应ASCII值:charbeep = 7;
(2)用转义序列:charnerf = ‘\n’;
③float型(浮点型)
值为小数(至少精确6位),如3.14,0.972,-1.2,...
格式说明符:%f,%e(打印指数计数法)
double:范围更大的浮点型,至少精确10位有效数字,%lf
④_Bool型(布尔型)
只有两个可能值:0或1。用于表示逻辑真与假(true与false)
⑤可移植的类型(inttypes.h)
⑥复数和虚数类型
⑦其它类型:由以上基本类型衍生出的其它类型,如数组、指针、结构、联合
4.刷新输出
输出的内容先被传递给缓冲区(中介存储区域),缓冲区的内容再不断地传递出去。
标准C规定在以下几种情况下交缓冲区的内容传给屏幕:①缓冲区满的时候②遇到换行符的时候(‘\n’)③需要输入的时候
5.scanf()函数
例:scanf(“%f”,&weight);
%f表示浮点数
&表示将读取的数值赋给事先声明的变量weight
6.运算符:sizeof
sizeof以字节为单位给出类型的大小,一字节= 8位,一位只能存储0或1,使用%zd说明符打印(或%u)
例:printf(“Typechar has a size of %zd bytes.\n”,sizeof(char));
第四章 字符串和格式化输入/输出
1.字符串
①字符串就是一个或多个字符的序列
②C没有为字符串定义专门的变量类型
③C将字符串存储在char数组中
④数组是同一类元素的有序序列,char数组就是char元素的有序序列
⑤字符串的字符被逐个放进char数组中,在字符串结尾必须添加一个'\0'字符(空字符),用以标记字符串的结束
2.使用字符串
①创建一个字符串数组例:charname[20];
②读取字符串:scanf(“%s”,name);
③打印字符串:printf(“%s”,name);
3.strlen()函数
①strlen()函数以字符为单位给出字符串的长度
②strlen()准确给出字符串中的字符个数,sizeof运算符会给出比字符串中字符数目大1的数。因为它包括了字符串结尾的'\0'字符(空字符)
4.用#define创建符号常量
①格式:#define常量的符号名常量的值
例:#defineNAME value
②#define格式必须放在文件开头
③文件中所有的常量的符号名(NAME)将被替换为常量的值(value)
5.printf()函数
①格式:printf(Control-string,item1,item2,...); print(“..%d..%f..%c..”,a,b,c);
②Control-string对应于”balabala...”
item1,item2,...对应于要打印的项目
③项目可以是被赋值的变量,也可以是常量,甚至是具有值的表达式
④必须在Control-string(控制字符串)中为每一个项目提供一个转换说明符(其实只是翻译),如%d、%f、%c等
⑤转换说明符必须与项目的数据类型相匹配,如字符串用%s
⑥printf()返回所打印的字符的数目,如果有输出错误,则返回一个负数
6.打印较长的字符串
用反斜线符号(/)和回车键的组合来换行。文本中会另起一行,但字符串中不会包含换行字符。
例:printf(“Hereis another way to print \
long string.\n”);
7.scanf()函数
①格式:scanf(“%d”,&a); scanf(“%d %d %f,…”,&a,&b,&c,…);
②如果用scanf()读取基本变量类型时,需要在变量名前加一个&。
如果用scanf()读取一个字符串到字符数组中,直接用数组名,不用加&
③需要输入多个项目时,用空格(space/tTab/Enter)来区分每个输入的项目,用回车(Enter)键确认输入完毕。
④scanf()读取机制:
%d:读取遇到的第一个非空白字符,如果是数字,则保存该数字字符并读取下一个字符,当到遇到非数字字符,则认为读取完毕。余下的字符存入缓冲区中,等待下一次的读取。
%s:读取遇到的第一个非空白字符,当到再次遇到非空白字符,则认为读取完毕。(可理解为读取一个单词,但不完全,因为类似*#&¥也是合法的)
%c:读取所有的字符,包括空白字符。
⑤如果scanf()中有普通字符,则输入格式必须一致。例如:scanf(“%d,%d”,&a,&b);,则输入格式必须为:12,13
⑥scanf()返回成功读入的个数,没有读取任何项目是返回0,失败则返回EOF(通常值为-1)。
8.printf()和scanf()的*修饰符
在print()中,如果用%*d,则在参数列表中要有一个*的值和一个d的值。*用来指定字段宽度。
例:printf(“%*d”,width, number); width指定字符宽度,number指定%d的值。
在scanf()中,如果在%和说明府字母之间有*,则使函数跳过相应的输入项目。
第五章 运算符、表达式和语句
1.基本运算符
①= (赋值运算符):
例:year= 2015;表示将值2015赋给名字为year的变量,该语句之后变量year的值为2015。
例:i= i + 1;表示将i + 1的值赋给变量i,该语句之后变量i的值为i+ 1,即变量i的值增加1。
数据对象:数据对象是泛指数据存储区的术语,数据存储区能用于保存值。例如,用于保存变量或数组的数据存储区是一个数据对象。
左值:即=符号左边的值。左值不能是常量。
右值:即=符号右边的值。右值是能将其值赋给左值的量。右值必须有值,也可以是能产生值的表达示。
操作数:指运算符操作的对象。例如,在year= 2015;中,=的左操作数是year,=的右操作数是2015。
二元运算符是指该运算符需要两个操作数。
②+ (加法运算符):将两侧的值相加
③- (减法运算符):将两侧的值相减
④* (乘法运算符):将两侧的值相乘
⑤/ (除法运算符):将两侧的值相除
⑥基本运算+、-、*和/的求值顺序与数学义上的相同,=在它们运算完之后再运算。
2.sizeof运算符
①sizeof:以字节为单位返回其操作数的大小。
格式:sizeof(变量名或类型名);
例:sizeof(year); sizeof(float);
②size_t:这是一个无符号整数类型。C的头文件系统使用typedef使size_t在系统中作为unsignedint或unsignedlong的同义词。
③typedef:C有一个typedef机制,它允许你为一个已有的类型创建一个别名。
例:typedef doublereal;将使real成为double的别名,此后可以声明一个real类型的变量:realdeal;,编译器将视real为double别名,于是把deal创建为一个double的变量。
3.%(取模运算符)
①%用于整数运算,该运算符计算出它右边的整数去除它左边的整数后所得到的余数。
例:13%5的值为3。
②C99为整数除法规定“趋零截尾”的规则。在些规则下,如果第一个操作数为负数,得到的模为负值,如第一个操作数为正数,得到的模为正值。
③可以通过从a中减去(a/b)*b来计算a%b。
例:-11 – (-11/)*5 = -11 – (-2)*5 = -11 –(-10) = -1;
4.++和—(增量和减量运算符)
①++(增量运算符):将其操作数的值加1
--(减量运算符):将其操作数的值减1
②++和—出现的方式
前缀模式:出现在它作用的变量的前面。如++a,--b。
后缀模式:出现在它作用的变量的后面。如a++,b--。
前缀模式先对变量值进行操作(加1或减1),再使用变量的值。
后缀模式先使用变量的值,再对变量进行操作。
5.表达式和语句
①表达式是由运算符和操作数组合构成的。最简单的表达式是只有一个常量或变量而没有运算符。
②每个表达式都有一个值。赋值表达式的值是与其左值相同,关系表达式(>,<,=)的值是其真假值(真为1,假为0)。
③语句是构造程序的基本成分。程序是一系列带有某种必需的标点的语句的集合。
④;是识别语句的标志。
6.副作用和顺序点
①C的主要目的是求表达式的值。
②副作用是对数据对象或文件的修改。
例:number =12;。C的主要目的是求表达式(number= 12)的值,这是一个赋值表达式,其表达式的值是其左值number的值。副作用为number的值被赋予12。最终该表达式的值为12.
③顺序点是程序中的一点,在该点处,所有的副作用都在进入下一步前被计算。
④在C中,;是一个顺序点,任何一个完整的表达式也是一个顺序点。
⑤完整表达式:不是一个更大的表达式的子表达式即完整表达式。完整表达式包括一个表达式语句里的表达式和在一个while循环里作为判断条件的表达式。
⑥复合语句:使用花括号{}起来的两个或更多的语句,它也被称为一个代码块(block)。
7.类型转换
①在包含两种数据类型的任何运算里,两个值都被转换成两种类型里较高的级别。
②通常类型级别从高到低的顺序是:longdouble、double、float、unsignedlong long、long long、unsignedlong、long、unsignedint和int.。
③当char和short类型出现在表达式里或者作为函数的参数时,它们都将被提升为int类型
8.指派运算符
①要避免以上的自动类型转换。
②通常不应该混合使用类型,如果用了,则使用类型指派来确保数据表达准确。
③格式:
(要转换成的类型名)正在使用的类型的数据
例:mice = (int)1.6 + (int)1.7;表达式最终会被转换为1+1,mice的值为2。
9.带有参数的函数
①使用函数前需要在mian函数前添加函数原型。
例:viodpound (int n);
第一个void表示该函数没有返回值,返回值是函数提供的可供使用的值。
pound()是函数的名字。pound可替换成其它有意义的名字,如Add。
int n表示函数的参数是int类型的。n在函数原型中无实际意义,可省略。如果不需要参数,用void代替
②函数调用:
可以在main函数中,也可在其它函数中调用
格式:pound(5);
5为传递给pound()函数的参数。5被称为实际参数(实际的值)
③函数定义:
函数定义通常在main函数外。
格式:用一个函数头和括在花括号中函数体。函数体中可以有需要的语句。
如:voidpound(int n)
{
while(n-->0)
{
printf(“#”);
}
printf(“\n”);
}
调用中的参数5将传递给n,此处的n为声明的变量名(形式参数),不可省略。函数体中n的第一次使用的值将为5,之后值将随函数体中对其的操作而变化。
④函数中的变量名是局部的,意味着在一个函数里定义的名字不会与函数外相同的名字发生冲突
第六章 C控制语句:循环
1.C风格的读循环
while(scanf(“%d”,&num) == 1) //读取值,并测试是否读取成功
{
//循环操作语句
}
2.while语句
①while循环的一般形式
while(表达式)
{
需要循环操作的语句
}
②while循环的终止
构造一个while循环时,循环中必须包含能改变判断表达式的值来使表达式的值最终变为假。
只有在计算判断条件的值时才决定是终止循环还是继续执行。
③while是入口条件循环,只满足循环条件,即判断表达式为真时才执行循环语句。
④只有位于判断条件之的的单个(简单语句或复合语句)语句才是循环部分
while语句本身在语法上是一个单独的语句,即使它使用了复合语句。该语句从while开始,到第一个分号结束,若使用了复合语句则到花括号结束。
3.关系运算符和表达式
①进行比较的判断表达式称为关系表达式,其中出现的运算符称为关系运算符。
<、<=、==、>=、>、==、!=
②不能用关系运算符来比较字符串。在浮点数比较中只能用<和>。
③为了避免把=运算符误用为==,进行比较的双方中,如果有一个是常量,则可以把它放在比较表达式的左边,这样做有助于发现错误。例:5== value;
4.C语言中的真
对C来说,一个真表达式的值为1,而一个假表达式的值为0.。更一般地,所有的非零值都被认为是真,只有0被认为是假。
5.for循环
①for循环的一般形式
for(初始化;测试;更新)
{
需要循环操作的语句
}
②for语句使用由分号分开的三个表达式来控制循环过程。初始化语句只在开始时执行一次。然后对测试语句求值,如果测试语句为真,则执行循环部分,接着执行更新语句,然后再执行测试语句。如果测试语句为假,则跳过循环部分,执行for语句的后语句。
③当测试语句为空时,该处的值会被视为真,即为无限循环。
6.更多赋值运算符
a += b等价于a = a + b
a -= b等价于a = a - b
a *= b等价于a = a * b
a /= b等价于a = a / b
a %= b等价于a = a % b
7.逗号运算符
①逗号作为运算符时有两个属性。
保证被它分开的表达式按从左到右的次序进行计算。
整个逗号表达式的值是右边成员的值。
例:x = (y = 3, (z = ++y + 2) + 5); x最后的值为11。
②逗号也可用作分隔符
例:charch, name;
printf(“%d %d”, num, year);
8.dowhile循环(退出条件循环)
①一般形式
do
{
需要循环操作的语句
}while(表达式);
②判断条件在执行循环之后进行检查,这样可以保证循环中的语句至少被执行一次。
③do while是一个语句,需要一个分号标志语句的结束。
9.嵌套循环
①嵌套循环是指在一个循环之内还有循环。
②通常使用嵌套循环来按行按列显示数据。
③在嵌套循环中,内部循环在外部循环的每次单独循环中都完全执行它的所有循环。
④通过使内部循环的一部分依赖于外部循环,可以使内部循环在每个周期中的表现不同。
10.数组
①一个数组就是线性存储的一系列相同类型的值。
②数组声明
例:floatdebts[20];
float表示数组的元素都是浮点类型的
debts是数组的名字
20表示数组最多可以有20个元素
③数组元素的编号是从0开始的。debts[0]表示数组的第一个元素,debts[19]表示数组的第20个元素
④[0]中的0和[19]的19都是用于标识数组元素的下标、索引或偏移量。下标必须是整数。
⑤通常数组元素从下标0开始按顺序存储。
⑥将元素读入数组中的例子:
scanf(“%f”, &debts[index]); //index为整型变量,用于指示数组下标
11.使用具有返回值的函数
①声明函数、调用函数、定义函数、使用return关键字,这些是定义并使用具有返回值的函数的基本要素。
②举例:answer =add(a, b);
在main函数或其它函数中调用add()函数,并将add()函数的返回值赋给相同类型的变量answer。若add()函数返回int型,则answer也应为int型
③现代的编程习惯是把程序的元素分为接口和实现部分。接口部分描述了如何使用一个特性,如函数原型;实现部分说明了采取的具体动作,如函数定义。