C语言基本概念(共16页).doc
精选优质文档-倾情为你奉上第2章 C语言基本概念2.1 初识“Hello world”程序为纪念C语言的设计者,第一个程序范例选自C语言的定义文档Brian Kernighan和Dennis Ritchie合著的The C Programming Language。该范例是“Hello world”程序,它是所有C程序员共有的财富,而你也即将成为其中的一员。【例2-1】Hello程序/* *File:hello.c *This program prints the message "Hello world" on the screen. */#include <stdio.h>main() printf("Hello,world.n");该程序作为一个文件存储在你所用的计算机系统的永久存储器中。文件名为hello.c,其中.c说明该文件为C语言源程序。下面介绍hello.c程序的组成部分:程序注释、库包含和主函数。2.1.1 程序注释C语言中,注释是在/*和*/之间的所有文字,可以占连续的几行。例2.1中的注释描述了该程序的作用。注释是写给人看的,而不是写给计算机的。注释向其他程序员传递该程序的有关信息。当C语言编译器将程序转换为可由机器执行的形式时,注释被完全忽略。当程序越来越复杂时,读者会发现给出合适的注释是使程序易读的最好方法之一。2.1.2 库包含(预处理指令)C语言只明确定义了一小部分操作,在计算机程序中许多必要的操作并不是由C直接定义的(如C语言中没有内置的“读”或“写”命令),实际的做法是,在每个C实现中都包含了一些使用函数和符号的集合,称之为库。C的ANSI(American National Standards Institute)标准要求在每个C实现中提供特定的标准库。C系统可以通过提供附加库来扩展可执行操作的数量,编程者也可以产生函数库。每个库都拥有一个文件名以.h结尾的标准头文件,如stdio.h。#include <stdio.h>这条预处理指令说明,在编译前把stdio.h中的信息“包含”到程序中。该指令通知预处理器,程序中用到的某些内容,如printf,可以在标准头文件stdio.h中找到。Stdio.h中包含了关于C标准输入/输出库的信息。注意:l 对每一个库使用一行#includel 预处理指令结束时没有“;”预处理指令详细内容将在后面章节介绍。2.1.3 主函数1. 函数术语“函数”来源于数学。在数学中函数是一条根据一个或多个给定参数进行数值计算的规则:f(x) = x + 1g(y,z) = y zC语言对“函数”的使用更加宽松。C语言中,函数是一系列独立的程序步骤,将这些程序步骤集合在一起,并且赋予了一个名字,就形成了一个函数。如:main() 语句;一个C程序是一个函数的集合。函数分为两类:程序员编写的函数;由C语言的实现所提供的函数。后一种函数也叫库函数,因为这些函数属于一个函数的“库”,而这个库是由编译器提供的。每个C程序必须有一个main函数,在执行程序时系统会自动调用main函数,即该函数是程序的入口。2. 语句函数所执行的步骤在中列出,这些步骤称为“语句”。这些语句共同组成函数的主体。大多数函数都有几个连续执行的语句。当运行C语言程序时,计算机执行main函数主体中包含的语句。printf("Hello,world.n");该语句用到了printf函数。此函数代表一组操作。当想要调用这些操作时,只要使用其函数名就可以一起引用此函数。在程序设计中,通过使用函数名来调用该函数的行为称为调用函数。printf("Hello,world.n")就是对函数printf的调用。该函数调用的结尾加上“;”就构成了一条语句。本节小结1.C程序的典型结构注释库包含 main() 语句;2.每个程序都应有注释,注释可以有效增强程序的可读性。3.库包含4.每个C程序是函数的集合,且每个C程序有且仅有一个main函数,它是程序的入口。5.语句2.2 求圆周长的程序为使大家对C语言程序的工作过程有更好的了解,现在来看一个稍复杂的例子。【例2-2】使用C 语言编程,程序根据用户输入的某圆的半径值,求该圆的周长。【分析】根据数学知识可知,c = 2 × PI × r 根据题目要求可知流程图如下:l 确定输出什么圆周长l 确定输入什么圆半径开始输入rL = 2 * PI * r 输出 L结束引入常量和变量概念:根据数学知识和题目要求,2、PI为常量,在整个程序运行期间不变;S和r是变量,r随着用户的输入而不同,S随着输入的r不同而不同。引入数据类型:数据类型用来说明变量所存储的数据的种类。半径r取整型int,圆周长L取实型double。【伪代码】#include <stdio.h>main() 定义变量; 输入半径; 计算周长; 输出周长;【源代码】#include <stdio.h>main() int radius; double c; printf(“Plesae input the radius:”); scanf(“%d”,&radius); c = 2 * 3.14 * radius; printf(“The c is %f .n”,c); 2.2.1 初识变量和常量1. 变量变量(Variable)是一些在编写程序时值未知的数据的存放处。例如,在编程时,程序员尚不知道用户要对半径为多大的圆求周长。当程序运行时,用户才会输入半径,程序才求出周长。为了在程序中引用这些目前尚未确定的数,我们可以创建一个变量来保存这些需要记住的值,并给该变量命名。一旦要用到它包含的值时,可使用其变量名。变量的名称要用心选择,以便将来阅读程序的程序员能容易地分辨出每个变量的作用。本程序中,变量radius代表半径,变量c代表周长。在C语言中,使用变量前,必须先声明该变量。声明一个变量就是告之编译器引用了一个新的变量名,并指定了该变量可以保存的数据类型。例如:int radius;2. 常量常量是一种在程序中保持固定类型和固定值的数据。例如,本程序中的2,3.14。2.2.2 输入阶段本程序在输入阶段必须要求用户输入一个半径值保存在radius变量中。变量值的输入过程包括2步。(1)程序应在屏幕上显示一个消息以使用户了解程序需要什么,这种类型的消息通常称为提示消息。例如:printf(“Plesae input the radius:”);(2)读取用户输入的数据。例如:scanf(“%d”,&radius);C中所有的输入输出操作都由称作输入输出函数来完成。本部分将介绍输入函数scanf,它是C的标准输入输出库中的一部分,可以通过预处理指令#include <stdio.h>来访问。scanf函数用来把从输入设备输入的数据复制到变量中。该函数调用包含函数名和函数参数两部分。函数参数由格式字符串(包含在“”)和输入列表组成。例:int sum;scanf(“%d”, &sum);在程序执行时,scanf函数将程序用户在键盘上键入的数据复制到内存中。关于scanf函数的具体说明见。2.2.3 计算阶段本程序的计算阶段由计算圆周长组成。在程序设计中,计算是通过写一个表达式来指定的,该表达式指定了必须的操作步骤。表达式的结构由赋值语句存储于一个变量中,以便程序后面的部分使用该结果。本章2.4节将详细定义表达式的结构。然而,即使没有一个完整的定义,理解C语言的表达式如何工作也很容易,它与传统的数学表达式非常类似:c = 2 * 3.14 * radius;2.2.4 输出阶段程序的输出阶段由显示计算结果组成。例如:printf(“The c is %f .n”,c);printf函数在屏幕上显示参数字符串中的每一个字符。但到了%处就有所不同了。%及其后面的字母f称为格式码。在本例中,格式码是%f。printf函数的格式码的作用就是作为值的占位符,在输出过程中,值将被插入到该位置。格式码中的字母用于指定输出格式。本例中的%f表示输出结果应显示为浮点数。此时的程序将显示以下信息:The c is .其中,下划线部分将由一个浮点数代替。要想知道显示的是什么样的整数,printf函数取调用时传来的第二个参数值,本例中是变量c。它的值显示在屏幕上,换行符使光标移至下一行。2.3 变量、常量和数据类型2.3.1 变量和常量定义1变量大多数程序在产生输出之前往往需要执行一系列的计算,因此需要在程序执行过程中有一种临时存储数据的方法。C语言中的这类存储单元称为变量。变量是程序执行过程中可以改变、可以赋值的量。具体说,变量是用于存储程序的输入数据和计算结果的存储单元。2常量常量是一种在程序中保持固定类型和固定值的数据。2.3.2 数据类型为了能在各种应用中使用,程序必须能够存储多种不同类型的数据。程序中每一个变量都必须有一个类型。类型用来说明变量所存储的数据的种类。C语言拥有广泛多样的类型。无论何时使用数据,无论使用的是整数、小数还是字符,C编译器都应该了解其数据类型。从整体上讲,数据类型是一组值及这组值上的一组操作。数据类型包括:l 一组值,即值的集合:n 例如:整型数据的集合就是机器硬件所能构造的所有整数(,-1,0,1,2,.)n 例如:字符型数据的集合就是键盘上出现的或可显示在屏幕上的符号的集合l 这组值上的操作集合:n 例如:给出两个整数,可以将它们相加、相乘等n 例如:给出两个字符数据,可以对两者进行比较,看它们字母顺序如何n 操作必须与值的集合项对应。本节只限定介绍int、double和char数据类型,详细内容将在后面章节介绍。数据类型的对象可以是变量或常量。1. int数据类型数学中整数就是非分数和小数的数。Int类型在C语言中代表整数。因为一个存储单元的大小是有限的,所以不是所有的整数都可以由int型表示。Int型数据通常与程序的执行环境的字长相同,对于16位环境,如DOS下的TC2.0,int型数据在内存中占16位,即2个字节;对于大多数32位环境,如windows XP等,int型数据在内存中占32位,即4个字节。VC6中int型数据在内存中占4个字节,取值范围是-至整数可以存储在int型变量中,进行常用的算术运算,加减乘除等,还可以比较两个整数的大小。2. double数据类型实数拥有一个整数部分和一个小数部分,并由小数隔开。C中数据类型double用于表示实数,如3.14159、0.005、15.8。实数可以存储在double型变量中,进行常用的算术运算,还可以比较两个整数的大小。VC6中double型数据在内存中占8个字节,15位有效数字,数值范围为-1.7*10-308至1.7*10308数据类型double是实数的一个抽象,因为它不包括所有的实数,一些实数太大或太小,还有一些实数不能在大小有限的存储单元内精确表示。然而,C中绝对可以表示足够多的实数来执行大部分具有相当精度的计算。3. char数据类型char类型表示一个字符值字母、数字或专用符号。每个char型数据都包含在单引号内,如:A z 5 * 字符可以存储在char型变量中,并可以比较字符数据的大小。char型数据占1字节。C语言将char型数据对应的ASCII码值保存在1个字节的内存空间中,所以C语言甚至允许对char型数据进行算术运算,但必须小心使用。2.3.3 变量声明与初始化变量(Variable)是一个值的存放处,它有三个重要属性:名称、值和数据类型。为了理解名称、值和数据类型三者之间的关系,可以将变量看做一个外部贴有标签的盒子。l 名称:变量的名字写在标签上,以区分不同的盒子l 值:变量的值对应于盒子内装的东西。l 数据类型:变量类型表明什么类型的数据可存储在盒子中。盒子标签上的名称从不改变,但可以经常从盒子中取出值或放入新值。在C语言中,使用变量之前,必须先声明该变量。声明(declaring)一个变量就是告诉C编译器引用了一个新的变量名,并指定该变量可以保存的数据类型。变量定义语法格式:类型关键字 变量名1,变量名2;例:int count;double area;char first_initial;int i,j,k;【说明】l 使用变量必须“先定义后使用”l 变量名是由用户定义的标识符,它的构成应符合以下规则n 名称必须以字母或下划线字符开头。n 名称的其他字符必须是字母、数字或下划线,不得使用空格和其他特殊符号n 名称不可以是关键字。n 变量名可以为任意长度,但C编译器只认为前31个字符有意义。n 在C语言中,变量名中出现的大写和小写字母被视为不同的字符。n 变量名应使读者易于明白其中存储的值是什么。实例操作【例2-2】使用C 语言编程,程序根据用户输入的某圆的半径值,求该圆的周长。#include <stdio.h>main()int radius;double c; 输入半径; 计算周长; 输出周长;在定义变量的同时可以为其赋初值,即C语言允许在定义变量的同时对变量进行初始化。例:int sum = 0;double source = 87.3;char grade = A 定义但未赋初值的变量中,一般存放的是随机数(静态变量除外)。2.3.4 常量常量是一种在程序中保持固定类型和固定值的数据。1.整型常量计算机中的数据都以二进制形式存储。在C程序中,为便于表示和使用,整型常量可以用十进制、八进制和十六进制三种形式来表示,编译系统会自动将其转换为二进制形式存储。C语言的编译器将整型常量按照int型变量的长度来存储。2.实型常量由于计算机中的实型数以浮点形式表示,即小数点位置可以是浮动的,因此实型常量可以称为实数或浮点数。在C程序中,实型常量的表示方法如下:(1)十进制小数形式(2)指数形式实型常量在存储时按double类型存储,即占8个字节。3.字符型常量C语言中的字符常量是由单引号括起来的一个字符。对于某些控制字符(如回车符、换行符等)无法通过键盘输入,因此,C语言还引入了另外一种特殊形式的字符常量转义字符。4.字符串常量字符串常量是由一对双引号括起来的一个字符序列。为便于C程序判断字符串是否结束,系统对每个用双引号括起来的字符串常量都添加一个字符串结束标识0。它不引起任何控制动作,也不显示。2.4 运算符与表达式当希望程序执行计算时,应写出一个表达式以指定必要的操作,其形式类似于数学表达式。例:n1 + n2C语言中的表达式由项和运算符组成。l 项:表示一个单独的数据值,如n1 ,n2n 常量n 变量n 函数调用n 括号中的表达式l 运算符:一个表示运算的字符或一个字符序列,如 +,-,*,/,+,-当程序运行时,执行表达式中每一个特定操作的过程称为求值。当对表达式进行求值时,每一个运算符都对两边项所表示的数据值进行运算。当所有运算符求值完毕后,剩下的一个数据就是计算结果。2.4.1 算术运算符与算术表达式1. 算术运算符算术运算符主要有+ - * / %(取余运算)2. 操作对象算法运算符的操作符可能是常量、变量或其他算术表达式。例:3.14 * 2 * 25 + count 34 * num 35 % 2 (值为1)3. 操作数数据类型运算符+ - * /既允许操作数是int型或double型,或允许两者的混合。当把int型操作数和double型操作数混合在一起使用时,运算结果是double型。运算符%可以与整数操作数一起使用,用于找出普通除法的余数。例:2 + 7 (值为9)2 + 7.0 (值为9.0)6 * 3.2 (值为19.2)5 / 2 (值为2)2 / 5 (值为0)2.0 / 5 (值为0.4)5 % 2(值为1)【注意】l 当两个操作数都是整数时,/ 通过丢掉分数部分的方法截取结果。l %要求整数操作数;如果两个操作数中有一个不是整数,那么程序将无法编译通过。l %左侧的操作数为被除数,右侧的操作数为除数,运算的结果为整除后的余数,余数的符号与被除数的符号相同。4. 运算符的优先级在C语言中,优先级顺序由符合标准数学用法的一系列排序规则决定,称之为优先级法则。对算术表达式来说,常见的规则有:(1)C编译器首先执行任何一元运算符(如-)(2)C编译器接下来执行乘法运算符* / %。若两个乘法运算符作用于同一操作数,则优先执行最左边的运算符。(3)再接下来执行加法运算符+ -。同样,若两个加法运算符作用于同一操作数,则优先执行最左边的运算符。5.运算符的结合性当一个表达式中出现不同类型的运算符时,首先按照他们的优先级顺序进行运算。当两类运算符的优先级相同时,则要根据运算符的结合性确定运算顺序。结合性表明运算时的结合分向。算术运算符的结合性为左结合。2.4.2赋值运算符与赋值表达式1. 简单赋值一旦计算出表达式的值就常常需要把这个值存储在变量中,以便以后使用。C语言中,简单赋值运算符(=)可以用于此目的。简单赋值运算符(=)与数学中的等号不同,所以应将它读作“变为”、“赋值为”。在数学领域,=表示两个值之间的关系,但是在C中它表示由计算机执行的一个操作。变量的值是用赋值表达式获得的。C语言中的赋值表达式形式如下:变量 = 表达式在写赋值表达式时,等号的左边可以是任何变量名,等号右边可以是任何表达式。【注意】l =右侧的表达式的值会赋给 =左侧的变量,变量原来的值就消失了。赋值表达式最后以;结束就形成了赋值语句。变量 = 表达式;【例】int item,sum;sum = 5;item = 10;sum = item + sum;实例操作【例2-2】使用C 语言编程,程序根据用户输入的某圆的半径值,求该圆的周长。#include <stdio.h>main() int radius,l; 输入半径; l = 2 * 3.14 * radius; 输出周长;2. 复合赋值例:假设变量balance保存某人银行账户的余额,他想往账户中存一笔钱,数额保存在变量desposit中。新的余额由表达式balance+desposit给出。于是可以写出如下赋值语句:newbalance = balance + desposit;然而在大多数情况下,人们不愿用一个新变量来存储结果。存钱的效果就是改变银行账户中的余额,我们可以把balance+desposit的值存入变量balance中,赋值语句改为:balance = balance + desposit;像这样对一个变量执行一些操作并将结果重新存入变量的语句在程序设计时使用十分频繁,因此C语言的设计者特意加入了它的一种习惯的简记方式,即将balance = balance + desposit;写成balance += desposit;凡是二元运算符,都可以与赋值符(=)一起组合成复合赋值符。C语言规定可以使用10种复合赋值运算符,即:+= -= *= /= %= << >>= &= = |=3. 赋值运算符的结合性赋值运算符的结合性是自右向左。2.4.3自增和自减运算符C语言提供了自增运算符(+)与自减运算符(-)。(1)自增运算符+i+ :在使用i之后,使i的值加1 +i :在使用i之前,先使i的值加1例:int m;int n = 3;m = n+ m = +n (2)自减运算符i- :在使用i之后,使i的值减1 -i :在使用i之前,先使i的值减1例:int m;int n = 3;m = n- m = -n 注意:l 自增和自减运算符只能用于变量。l 自增和自减运算符的优先级与负号优先级相同。l 自增和自减的结合方向是“自右至左”。例:int m;int n = 3;m = -n+ 提示:良好的程序设计风格提倡在一行语句中,一个变量最多只出现一次增1或减1运算。因为过多的+、-混合运算,会导致程序的可读性变差。同时,C语言规定表达式中的子表达式以未定顺序求值,这就允许编译程序自由重排表达式的顺序,以便产生最优代码。这也导致相同的表达式用不同的编译器编译时,可能产生不同的运算结果。例如:Sum = (+a)+(+a);Printf(“%d%d”,a,a+,a+);建议不要采用。2.4.4强制转换运算符使用强制转换运算符可以把表达式的结果硬性转换为一个用户指定的类型值。(类型)表达式例:Int n;Double d;d = (double)n / 2 2.4.5求字节数运算符不能对变量所占的字节数想当然,要想获知int型数据的准确字节数信息,可以使用sizeof运算符计算其在内存中所占的字节数。sizeof(表达式)其中,表示可以是变量名、常量以及数据类型名。该运算符的功能:求表达式中变量名所代表的内存单元所占的字节数;或求表达式中常量所占内存单元的字节数;或求表达式中的数据类型表示的数据在内存单元中所占的字节数。2.5 格式化输入与输出数据可以以两种方式存储在内存中,赋值给变量或利用函数将数据从输入设备复制到变量中。数据从输入设备传送到内存的指令称为输入操作。当程序执行时,会进行计算,并将结果保存到内存中。程序结果可以通过输出操作显示给程序用户。显示存储在内存中的信息的指令为输出操作。C中所有的输入输出操作都由称作输入输出函数来完成。本节将介绍输入函数scanf和输出函数printf。它们是C的标准输入输出库中的一部分,可以通过预处理指令#include <stdio.h>来访问。2.5.1printf函数printf函数来显示程序输出行。函数调用包含函数名和函数参数两部分。函数参数由格式字符串(包含在“”)和输出列表组成。例:printf(“The sum is %d .n”,sum);该函数调用结果是显示如下内容:The sum is 15 .这个结果是格式字符串“The sum is %d .”中,用sum的值代替它的占位符%d后显示的结果。格式字符串的占位符占位符变量类型函数使用%cCharPrintf%dIntPrintf%fdoublePrintf上面的例子中的格式字符串还包含了换行符转义序列n。光标是一个移动的位置标记,用于指示在屏幕上的下一个显示信息的位置。当执行printf函数调用时,如果在格式字符串中有n转义序列,那么光标就会到达屏幕下一行的起始位置。实例操作【例2-2】使用C 语言编程,程序根据用户输入的某圆的半径值,求该圆的周长。#include <stdio.h>main()int radiusdouble c; 输入半径; c = 2 * 3.14 * radius; printf(“The l is %f .n”,l);2.5.2 scanf函数scanf函数用来把从输入设备输入的数据复制到变量中。该函数调用包含函数名和函数参数两部分。函数参数由格式字符串(包含在“”)和输入列表组成。例:int sum;double item;scanf(“%d%lf”, &sum, &item);在程序执行时,scanf函数将程序用户在键盘上键入的数据复制到内存中。【注意】l 格式字符串是由占位符加“”构成的字符串,一个占位符对应输入列表中的一个变量。l 在输入列表中的每个int、double或char型变量前都有一个&符号。l 逗号用于分隔变量名称。l 占位符的顺序必须与输入列表中变量的顺序一致。l 输入数据的顺序必须与输入列表中变量的顺序一致。l 在输入的数据项之间应插入一个或多个空格和回车。实例操作【例2-2】使用C 语言编程,程序根据用户输入的某圆的半径值,求该圆的周长。#include <stdio.h>main()int radiusdouble c;scanf(“%d”,&radius); c = 2 * 3.14 * radius; printf(“The l is %f .n”,l);专心-专注-专业