1、C语言入门教程(一) 概述 一、C 语言的产生与发展C语言是 1972年由美国的 Dennis Ritchie设计发明的,并首次在UNIX操作系统的 DEC PDP-11 计算机上使用。它由早期的编程语言BCPL (Basic Combind Programming Language)发展演变而来。在1970年,AT分开。 Library directories 库文件路径,多个子目录用;分开。 Output directoried 输出文件(.OBJ,.EXE,.MAP 文件)的目录。Turbo C directoried Turbo C 所在的目录。Pick file name 定义加载的
2、 pick文件名,如不定义则从 current pick file中取。.Arguments(命令行参数)允许用户使用命令行参数。.Save options(存储配置)保存所有选择的编译、连接、调试和项目到配置文件中,缺省的配置文件为 TCCONFIG.TC。.Retrive options 装入一个配置文件到 TC中,TC 将使用该文件的选择项。7、Debug(调试)菜单按 Alt+D可选择 Debug菜单,该菜单主要用于查错,它包括以下内容: .Evaluate(Ctrl+F4)Expression 要计算结果的表达式。Result 显示表达式的计算结果。New value 赋给新值。.C
3、all stack(Ctrl+F3) 该项不可接触。而在 Turbo C debuger时用于检查堆栈情况。 .Find function 在运行 Turbo C debugger时用于显示规定的函数。.Refresh display 如果编辑窗口偶然被用户窗口重写了可用此恢复编辑窗口的内容。8、Break/watch(断点及监视表达式) 按 Alt+B可进入 Break/watch菜单, 该菜单有以下内容: .Add watch(Ctrl+F7) 向监视窗口插入一监视表达式。.Delete watch 从监视窗口中删除当前的监视表达式。.Edit watch 在监视窗口中编辑一个监视表达式。
4、.Remove all watches 从监视窗口中删除所有的监视表达式。.Toggle breakpoint(Ctrl+F8) 对光标所在的行设置或清除断点。.Clear all breakpoints 清除所有断点。.View next breakpoint 将光标移动到下一个断点处。(二)、编辑区 所有的程序代码都在这个区域编写,修改。用 ALT+E进入编辑区。在编辑区的最上面还显示光标所数在行和所在列数。(三)、信息窗口 在编译过程中显示程序的错误和警告;在单步调试过程中,显示所添加监视表达式的值。(四)、参考行 包括以下内容F1-Help 显示帮助信息F5-Zoom 让编辑区最大,即
5、屏蔽信息窗口;再按一次,返回。F6-Switch 在编辑区和信息窗口之间切换。F7-Trace 单步运行程序,并跟踪到函数体内部F8-Step 单步运行程序,不跟踪到函数体内部F9-Make 编译链接F10-Menu 回到主菜单(二) 变量和常量编 译环境设置好以后,就可以正式学习 C语言了。一、变量(一)、变量类型和表示方法1.什么是变量?一句话,变量是存储数据的值的空间。由于数值的类型有多种,有整数、小数(浮点数) 、字符等等,那么对应的变量就有整型变量、浮点型变量、字符型变量。变量还有其他的具体分类。整型变量还可具体分为无符号型、长整型和短整型。浮点型也可分为单精度型、双精度型和长双精度
6、型。此外还可以分为静态变量、外部变量、寄存器变量和自动存储变量。这些数据类型我们在本节和后面的章节中都会陆陆续续介绍。那么变量我们总要给它取个名字吧,这个名字我们叫做标识符。标识符的命名有一定的规则:(1).标识符只能由字母、数字和下划线三类字符组成(2).第一个字符必须是字母(第一个字符也可以是下划线,但被视作系统自定义的标识符)(3).大写字母和小写字母被认为是两个不同的字符,如 A和 a是两个不同的标识符 (4).标识符可以任意长,但只有前 32位有效。有些旧的 C版本对外部标识符的限制为 6位。这是由于链接程序的限制所总成的,而不是 C语言本身的局限性(5).标识符不能是 C的关键字2
7、.从上面的规则中,有个关键字的概念。那么什么叫关键字呢?从表面字意上也可以看出,关键字是 C语言本身某些特性的一个表示,是唯一的代表某一个意思的。下面列出 ANSI标准定义的 32个 C语言的关键字,这些关键字在以后的学习中基本上都会用到,到时再说它们的各自用法。auto break case char const continue defaultdo double else enum extern float forgoto if int long register return shortsigned sizeof static struct switch typedefunion uns
8、igned void volatile whileC语言还包括一些不能用做标识符的扩展关键字。asm cdecl _cs _ds _es far huge interrupt near pascal _ss所以在以后的学习中,在给变量命名时要避开这些关键字。3. Turbo C2.0规定所有变量在使用前都必须加以说明。一条变量说明语句由数据类型和其后的一个或多个变量名组成。变量说明的形式如下: 类型 ; 这里类型是指 Turbo C2.0的有效数据类型。变量表是一个或多个标识符名,每个标识符之间用,分隔。(二)、整型变量整型变量是用来存储整数的。整型变量又可具体分为好几种,最基本的整型变量是用
9、类型说明符int声明的符号整型,形式如下:int Counter;这里 int是类型说明符,Counter 是变量的名字。整型变量可以是有符号型、无符号型、长型、短型或象上面定义的普通符号整型。整型是 16位的,长整型是 32位,短整型等价于整型。以下是几种整型变量的声明示例:long int Amount; /*长整型*/long Amount; /*长整型,等价于上面*/signed int Total; /*有符号整型*/signed Total; /*有符号整型,等价于上面*/unsigned int Offset; /*无符号整型*/unsigned Offset; /*无符号整型,
10、等价于上面*/short int SmallAmt; /*短整型*/short SmallAmt; /*短整型,等价于上面*/unsigned short int Month; /*无符号短整型*/unsigned short Month; /*无符号短整型,等价于上面*/从上面的示例可以看出,当定义长整型、短整型、符号整型或无符号整型时,可以省略关键字 int。注明:1.用 signed对整型变量进行有符号指定是多余的,因为除非用unsigned指定为无符号型,否则整型都是有符号的。2.当一个变量有几重特性时,声明关键字的顺序可以任意。以下几种声明是等价的:unsigned long T1;
11、long unsigned T2;unsigned long int T3;unsigned int long T4;long unsigned int T5;long int unsigned T6;int unsigned long T7;int long unsigned T8;(三)、浮点类型变量顾名思义,浮点类型变量是用来存储带有小数的实数的。C语言中有三种不同的浮点类型,以下是对这三种不同类型的声明示例:float Amount; /*单精度型*/double BigAmount; /*双精度型*/long double ReallyBigAmount; /*长双精度型*/这里 A
12、mount,BigAmount,ReallyBigAmount都是变量名。浮点型都是有符号的。(四)、字符型变量字符型变量中所存放的字符是计算机字符集中的字符。对于 PC机上运行的 C系统,字符型数据用 8位单字节的 ASCII码表示。程序用类型说明符 char来声明字符型变量:char ch;这条声明语句声明了一个字符型变量,标识符为 ch。当以这种形式声明变量之后,程序可以在表达式中引用这个变量,关于语句和表达式的知识在后面将会介绍。字符数据类型事实上是 8位的整型数据类型,可以用于数值表达式中,与其他的整型数据同样使用。在这种情况下,字符型变量可以是有符号的,也可以是无符号的。对于无符号
13、的字符型变量可以声明为:unsigned char ch;除非声明为无符号型,否则在算术运算和比较运算中,字符型变量一般作为 8位有符号整型变量处理。还有其他的如指针型变量,void 型变量,以后再介绍。二、常量常量的意思就是不可改变的量,是一个常数。同变量一样,常量也分为整型常量、浮点型常量、字符型常量,还有字符串常量、转义字符常量和地址常量。(一)、整型常量整型常量可以是长整型、短整型、有符号型、无符号型。在 Tubbo C 2.0里有符号整型常量的范围从-32768 到 32767,无符号整型的为 0到 65535;有符号长整型的范围为-2147483648 到2147483647。无符
14、号长整型的范围为 0到 4294967295。短整型同字符型。可以指定一个整型常量为二进制、八进制或十六进制,如以下语句:-129, 0x12fe, 0177常量的前面有符号 0x,这个符号表示该常量是十六进制表示。如果前面的符号只有一个字母 0,那么表示该常量是八进制。有时我们在常量的后面加上符号 L或者 U,来表示该常量是长整型或者无符号整型:22388L, 0x4efb2L, 40000U后缀可以是大写,也可以是小写。(二)、浮点型常量一个浮点型常量由整数和小数两部分构成,中间用十进制的小数点隔开。有些浮点树非常大或者非常小,用普通方法不容易表示,可以用科学计数法或者指数方法表示。下面是
15、一个实例:3.1416, 1.234E-30, 2.47E201注意在 C语言中,数的大小也有一定的限制。对于 float型浮点数,数的表示范围为-3.402823E38 到 3.402823E38,其中-1.401298E-45到 1.401298E-45不可见。double 型浮点型常数的表示范围为-1.79E308到 1.79E308,其中-4.94E-324 到 4.94E-324不可见。在浮点型常量里我们也可以加上后缀。FloatNumber=1.6E10F; /*有符号浮点型*/LongDoubleNumber=3.45L; /*长双精度型*/后缀可大写也可小写。说明: 1. 浮点
16、常数只有一种进制(十进制)。 2. 所有浮点常数都被默认为 double。 3. 绝对值小于 1的浮点数, 其小数点前面的零可以省略。如:0.22可写为.22, -0.0015E-3 可写为-.0015E-3。 4. Turbo C默认格式输出浮点数时, 最多只保留小数点后六位(三)、字符型常量 字符型常量所表示的值是字符型变量所能包含的值。我们可以用ASCII表达式来表示一个字符型常量,或者用单引号内加反斜杠表示转义字符。A, x2f, 013;其中:x 表示后面的字符是十六进制数,0 表示后面的字符是八进制数。注意:在 Turbo C 2.0中,字符型常量表示数的范围是-128 到127,
17、除非你把它声明为 unsigned,这样就是 0到 255。(四)、字符串常量字符串常量就是一串字符,用双引号括起来表示。Hello,World!nEnter selection:aError!(五)、转义字符上面我们见到的x,n,a 等等都是叫转义字符,它告诉编译器需要用特殊的方式进行处理。下面给出所有的转义字符和所对应的意义:转义字符 描述 单引号 双引号 反斜杠0 空字符0nnn 八进制数a 声音符b 退格符f 换页符n 换行符r 回车符t 水平制表符v 垂直制表符x 十六进制符它们的具体用法我们到讲输出语句时再介绍。(六)、地址常量我们前面说的变量是存储数据的空间,它们在内存里都有对应
18、的地址。在 C语言里可以用地址常量来引用这些地址,如下:total1=total2=0;第一个赋值语句大家都能理解。 第二个赋值语句的意思是把 0同时赋值给两个变量。这是因为赋值语句是从右向左运算的,也就是说从右端开始计算。这样它先total2=0;然后 total1=total2;那么我们这样行不行呢?(total1=total2)=0;这样是不可以的,因为先要算括号里面的,这时 total1=total2是一个表达式,而赋值语句的左边是不允许表达式存在的。二、算术运算符在 C语言中有两个单目和五个双目运算符。符号 功能+ 单目正- 单目负* 乘法/ 除法% 取模+ 加法- 减法下面是一些赋
19、值语句的例子, 在赋值运算符右侧的表达式中就使用了上面的算术运算符:Area=Height*Width;num=num1+num2/num3-num4;运算符也有个运算顺序问题,先算乘除再算加减。单目正和单目负最先运算。取模运算符(%)用于计算两个整数相除所得的余数。例如:a=7%4;最终 a的结果是 3,因为 7%4的余数是 3。那么有人要问了,我要想求它们的商怎么办呢?b=7/4;这样 b就是它们的商了,应该是 1。也许有人就不明白了,7/4 应该是 1.75,怎么会是 1呢?这里需要说明的是,当两个整数相除时,所得到的结果仍然是整数,没有小数部分。要想也得到小数部分,可以这样写 7.0/
20、4或者 7/4.0,也即把其中一个数变为非整数。那么怎样由一个实数得到它的整数部分呢?这就需要用强制类型转换了。例如:a=(int) (7.0/4);因为 7.0/4的值为 1.75,如果在前面加上(int)就表示把结果强制转换成整型,这就得到了 1。那么思考一下 a=(float) (7/4);最终a的结果是多少?单目减运算符相当于取相反值,若是正值就变为负值,若是负数就变为正值。单目加运算符没有意义,纯粹是和单目减构成一对用的。三、逻辑运算符逻辑运算符是根据表达式的值来返回真值或是假值。其实在 C语言中没有所谓的真值和假值,只是认为非 0为真值,0 为假值。符号 功能0|-2!4;当表达式
21、进行a|b-1;因为 a=2,为真值,所以不管 b-1是不是真值,总的表达式一定为真值,这时后面的表达式就不会再计算了。四、关系运算符关系运算符是对两个表达式进行比较,返回一个真/假值。符号 功能 大于= 大于等于= 右移赋值与 Total+=3;有没有区别?答案是有的,对于A=A+1,表达式 A被计算了两次,对于复合运算符 A+=1,表达式 A仅计算了一次。一般的来说,这种区别对于程序的运行没有多大影响,但是当表达式作为函数的返回值时,函数就被调用了两次(以后再说明),而且如果使用普通的赋值运算符,也会加大程序的开销,使效率降低。七、条件运算符条件运算符(?:)是 C语言中唯一的一个三目运算
22、符,它是对第一个表达式作真/假检测,然后根据结果返回两外两个表达式中的一个。?:在运算中,首先对第一个表达式进行检验,如果为真,则返回表达式 2的值;如果为假,则返回表达式 3的值。例如:a=(b0)?b:-b;当 b0时,a=b;当 b不大于 0时,a=-b;这就是条件表达式。其实上面的意思就是把 b的绝对值赋值给 a。八、逗号运算符在 C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。假设 b=2,c=7,d=5,a1=(+b,c-,d+3);a2=+b,c-,d+3;对于第一行代码,有三个表达式,用逗号分开,所以最终的值应该是最
23、后一个表达式的值,也就是 d+3,为 8,所以 a=8。对于第二行代码,那么也是有三个表达式,这时的三个表达式为 a2=+b、c-、d+3,(这是因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽然也为 8,但 a2=3。还有其他的如位逻辑运算符,位移运算符等等,我们等到讲位运算时再说明。九、优先级和结合性 从上面的逗号运算符那个例子可以看出,这些运算符计算时都有一定的顺序,就好象先要算乘除后算加减一样。优先级和结合性是运算符两个重要的特性,结合性又称为计算顺序,它决定组成表达式的各个部分是否参与计算以及什么时候计算。下面是 C语言中所使用的运算符的优先级和结合性:优先级 运算符 结合性
24、(最高) () - . 自左向右! + - + - * ),C 语言中所有的语句和声明都是用分号结束,在分号出现之前,语句是不完整的。例如:1+2;Counter/3+5;Height*Width;表达式本身什么事情都不做,只是返回结果值。在程序不对返回的结果值做任何操作的情况下,返回的结果值不起任何作用,表达式的作用有两点,一个是放在赋值语句的右边,另一个是作为函数的参数(以后再介绍)。表达式返回的结果值是有类型的。表达式隐含的数据类型取决于组成表达式的变量和常量的类型。因此,表达式的返回值有可能是某种大小的整型,或者是某精度的浮点型,或者是某种指针类型。这里面就有类型转化的问题了,在前面说
25、整型运算的时候也提到过。类型转化的原则是从低级向高级自动转化(除非人为的加以控制)。计算的转换顺序基本是这样的:字符型整型长整型浮点型单精度型双精度型就是当字符型和整型在一起运算时,结果为整型,如果整型和浮点型在一起运算,所得的结果就是浮点型,如果有双精度型参与运算,那么答案就是双精度型了。强制转换是这样的,在类型说明符的两边加上括号,就把后面的变量转换成所要的类型了。如:(int) a;(float) b;第一个式子是把 a转换成整型,如果原先有小数部分,则舍去。第二个式子是把 b转换成浮点型,如果原先是整数,则在后面补0。每一个表达式的返回值都具有逻辑特性。如果返回值为非 0,则该表达式返
26、回值为真,否则为假。这种逻辑特性可以用在程序流程控制语句中。有时表达式也不参加运算,如:if(a|b) 53?a+:b+;当 a为真时,b 就不参加运算了,因为不管 b如何,条件总是真。 二、语句(一)、赋值语句其实这个问题,在讲赋值运算符的时候已经讲了一些了。Amount=1+2;Total=Counter/3+5;Area=Height*Width;也许你会发现,这些赋值语句很象代数方程,在某些情况下,我们的确可以这样理解,但有时它们是不一样的。看下面:Num=Num+1;这显然不是一个等式。(二)、用逗号分隔开的声明语句C语言可大多数语言一样,允许用逗号分隔声明语句中的标识符列表,说明这
27、些运算符是同一变量类型。例如:float Area,Height,Width;但有些程序员喜欢把标识符写在不同的行上。如:float Area,Height,Width;这样写至少有一个好处,就是可以在每个标识符后边加上注释。在声明变量的时候,也可以直接给变量赋值,这叫做变量的初始化。如:int a;a=3;等价于:int a=3;我们也让某些变量初始化,某些不初始化,如:int a=3,b,c=5;在进行初始化时,初始化表达式可以是任意的(对全局变量和静态变量有区别),由于逗号运算符是从左到右运算的,那么看看这样行不行?int a=3,b=a,c=5;(三)、标准输入输出语句Turbo C
28、2.0标准库提供了两个控制台格式化输入、输出函数scanf();和 printf();这两个函数可以在标准输入输出设备上以各种不同的格式读写数据。scanf() 函数用来从标准输入设备(键盘)上读数据,printf()函数用来向标准输出设备(屏幕)写数据。下面详细介绍这两个函数的用法。1.标准输入语句scanf()函数是格式化输入函数, 它从标准输入设备(键盘) 读取输入的信息。其调用格式为: scanf(, );格式化字符串包括以下三类不同的字符; (1).空白字符:空白字符会使 scanf()函数在读操作中略去输入中的一个或多个空白字符。(2).非空白字符:一个非空白字符会使 scanf(
29、)函数在读入时剔除掉与这个非空白字符相同的字符。(3).格式化说明符:以%开始,后跟一个或几个规定字符,用来确定输出内容格式。Turbo C 2.0提供的输入格式化规定符如下: 符号 作用 %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %x,%X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 地址表是需要读入的所有变量的地址,而不是变量本身,取地址符为 上例中的 scanf()函数先读一个整型数,然后把接着输入的逗号剔除掉,最后读入另一个整型数。如果,这一特定字符没有找到,scanf()函数就终止。若参数之间的分隔符为
30、空格,则参数之间必须输入一个或多个空格。说明: (a).对于各个变量,类型说明符是什么,输入格式化说明符就应该用对应的类型。否则会出现程序错误或输入数据和理想的不一样。(b).对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用 scanf()函数时,不需要在它们前面加上 scanf(%s, p);scanf(%s, str); 具体字符串,指针的知识以后再介绍。(c).可以在格式化字符串中的%各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。 如上例中若规定只能输入 10字符给字符串指针 p,则第一条 scanf()函数语句变为:scanf(%10s, p)
31、;程序运行时一旦输入字符个数大于 10, p就不再继续读入。实际使用 scanf()函数时存在一个问题, 下面举例进行说明: 当使用多个 scanf()函数连续给多个字符变量输入时, 例如: char c1, c2; scanf(%c, scanf(%c, 运行该程序,输入一个字符 A后回车(要完成输入必须回车),在执行scanf(%c,(这个函数的使用方法将在本节最后讲述)。(d).当在格式说明符之间加入*时,表示跳过输入,例如:scanf(%3*d,当输入 12345的时候,前面三个字符跳过去不考虑,最终变量 a的值为 45。2.标准输出语句printf()函数是格式化输出函数,一般用于向
32、标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf(, ); 其中格式化字符串包括两部分内容:一部分是正常字符, 这些字符将按原样输出;另一部分是格式化规定字符,以%开始,后跟一个或几个规定字符,用来确定输出内容格式。 参量表是需要输出的一系列参数,其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用,分开,且顺序一一对应,否则将会出现意想不到的错误。对于输出语句,还有两个格式化说明符符号 作用%e 指数形式的浮点数%g 自动选择合适的表示法说明: (1).可以在%和字母之间插进数字表示最大场宽。 例如: %3d 表示输出 3位整型数,不够 3位右对齐。 %9.2f 表示输出场宽为 9的浮点数,其中小数位为 2,整数位为 6,小数点占一位,不够 9位右对齐。 %8s 表示输出 8个字符的字符串,不够 8个字符右对齐。 如果字符串的长度、或整型数位数超过说明的场宽,将按其实际长度