国二C语言精讲资料

上传人:微*** 文档编号:169040729 上传时间:2022-11-14 格式:DOCX 页数:236 大小:666.26KB
收藏 版权申诉 举报 下载
国二C语言精讲资料_第1页
第1页 / 共236页
国二C语言精讲资料_第2页
第2页 / 共236页
国二C语言精讲资料_第3页
第3页 / 共236页
资源描述:

《国二C语言精讲资料》由会员分享,可在线阅读,更多相关《国二C语言精讲资料(236页珍藏版)》请在装配图网上搜索。

1、第一章C语言基础知识该章内容:本章是整个C语言最基础的部分;表达式是C语言的核心,本章会学习到不同的表达式.学习方法:对关键的知识点一定要多背,把最基础的习题多做几遍,在以后的学习中要多次反问来复习,加深印象。第一节C语言的基本构成知识点:C语言的注释;关键字;书写风格:常量和变量重要程度:1、C语言的良好风格用C语言编写的程序,称为C语言源程序,简称C程序。本节将通过一个简单的C程序例子,向大家介绍C语言的一些基本构成和如何写出风格良好的 程序,使读者对C语言有一个初步的认识。例1 :计算两个整数之和的C程序#include stdio.hmain()/*求两数之和*/(inta,b,sum

2、;/* 变量说明*/a=10;/*把整数10赋值给变量a */b=20;/*把整数20赋值给变量b */sum=a+b;/*把两数之和赋值给变量sum */printf(a=%d,b=%d,sum=%dn,a,b,sum); /* 把计算结果输出到用户屏幕上*/)好的风格: 1.花括号独占一行,有对应关系的花括号在同一列;2 .有层次关系的代码有必要的缩进;3 . 一条语句独占一行4 .有适当的注释2、关于注释的说明(考点一)令程序中以“/*”开头并且以“*厂结尾的部分表示程序的注释部分。令注释可以加在程序的任何位置。令 注释是为了提高程序的可读性而增加的,不属于C语言。令/*/*dddddd

3、d*/*/这样的注释不是合法的。注释是从/* ”开始到 */ “结束的。以该例为准,属 于注释的就是/* */两个之间的/*ddddddd,所以最后剩下的*/就是多余了。例1:阅读以下程序,想一想结果是多少?main() int a=0,b=0;a =10;b=20;/*给a赋值给b赋值*/printf(a+b=%dn,a+b); /* 输出计算结果*/这是2006年9月全国计算机等级考试二级考试的第19题。需要特别注意的是,程序第三行“/*”开始的注释部分,直到第四行末尾才结束。因此上面的程序等价于以下的程序: main() int a=O,b=O;a =10;printf(na+b=%dn

4、H,a+b);3、标识符(考试重点)在C语言中用于标识名字的有效字符序列称为标识符。标识符可以用作常量名、变量名、符号名、 函数名和后面要学到的指针名、数组名等。C语言中标识符的命名规则如下:1)标识符只能由字母、数字和下划线组成;2)标识符的第一个字符必须是字母或下划线。3)标识符区分大小写字母。如int与Int是两个完全不同的标识符。合法的标识符:a x sum spels program abl _to file_5 alb2c3 _2 B3非法的标识符:abl2#(含有不合法的字符“#)al-c(含有不合法的字符abc(空格不是合法标识符)w(“兀”不是字母,为不合法标识符字符)23a

5、b(第一个字符不能为数字)C语言的标识符分为如下三类:1)关键字关键字是具有特定含义的、专门用来说明C语言特定成分的一类标识符。关键字均由小写字母构 成。Int就不是关键字。2)预定义标识符预定义标识符(如printf,scanf,sin,isalum等)和编译预处理命令名(如define,include等)。注意, 预定义标识符可以作为“用户标识符”使用。3)用户标识符(考试重点)不能是关键字;只能由字母、数字和下划线组成;第一个字符必须是字母或下划线。Int可以作为用户标识符,int就不可以作为用户标识符。考点:1.识别哪些是(或不是)标识符2.识别哪些是(或不是)用户标识符例2:以下不能

6、定义为用户标识符的是A) scanf B) Void C) _3com_ D) int分析:本题答案选D。因为int是关键字,关键字不能作为用户标识符。答案(A)的scanf虽然 是预定义标识符,但是预定义标识符可以作为用户标识符使用。(B)中Void的第一个字符V大写, 它与关键字void是两个不同的标识符,故它可以作为用户标识符。(C)中的一3com一符合标识符的命 名规则,且不是关键字,故可以定义为用户标识符。例3:以下不合法的用户标识符是A) j2_KEY B) Double C) 4d D) _8_分析:本题答案选C。答案(A)是一个用户标识符,符合标识符的命名规则。答案(B)也是用

7、 户标识符,需要注意的是,它与关键字double是两个不同的标识符。答案(D)是用户标识符,由数 字和下划线组成,且第一个字符为下划线。只有答案(C)是不合法的用户标识符,因为它的第一个 字符是数字,不符合标识符的命名规则。标识符的常见错误:1 .数字开头2 .包含减号3 .用户标识符使用的是关键字4、常量。C语言中,还有另外一种常量是用标识符命名的,称为符号常量。下面程序的PI就是符号常量。例4:计算圆面积的C语言程序#define PI 3.14159main() float r,area;r=12.5;area=PI*r*r;printf(,area=%fn,area);)程序的第一行是

8、宏定义,以后遇到PI就用其后的内容3.14159来原样替换。这里的PI就是一 个符号常量。通常,符号常量用大写字母表示,但这并不是语法上的要求,只不过用大写字母书写符 号常量,便于辨认。当进行宏定义后,程序中只要用到相应的数值常量都可以用符号常量代替,这就 给程序的修改提供了方便。例如,如果需要进一步提高圆周率的精度,可以直接修改宏定义中的数值 常量:#define PI 3.1415926这样,程序中只要用到PI的地方,其值都自动变为3.1415926。5、变量与常量对应的是变量。顾名思义,变量就是在程序的运行过程中其值可以改变的量。例1中的a, b都是变量,它们是由用户定义的标识符,变量的

9、命名必须遵循标识符的命名规则。用盒子的理论来描述:1)变量就是盒子,里面装的内容可以改变。2)通过赋值语句就可以改变盒子里的内容。3)每次使用盒子时,盒子里都应该有确切的内容而不能是不确定的值。4)每次使用盒子时,都是用的现在盒子里装的内容。以前装过什么内容没有任何影响。第二节整型数据知识点:进制的转换:整型的定义和使用;重要程度:在C语言中,有三种基本的数据类型,它们是整型、实型和字符型。1、数制转换二进制的数,基为二,某位出现的最大数字是2-1=1;八进制的数,基为八,某位出现的最大数字是8-1=7;十六进制的数,基为十六,某位出现的最大数字是f (相当与十进制的15)o在十六进制中,数

10、字由十六个代码组成,分别是09和AF (或者是af)这十六个代码。表1列举出十进制数字从015时,相应的二进制、八进制和十六进制数字。(同列的为一组,表 示相同的值)表1十进制、二进制、八进制和十六进制对照表十进制01234567二进制011011100101110111八进制01234567十六进制01234567十进制89101112131415二进制10001001101010111100110111101111八进制1011121314151617十六进制89ABCDEF十进制的数字在我们日常生活中普遍使用,然而在计算机内部,数字均以二进制形式表示和存放。 引例:(1)将任意进制的数转

11、换为十进制数:将这个数按照引例中的方法展开。注意底数使用的是该进制的基。使用以上的方法,我们再来看两个例子:(23E) 16 = 2X162+3X16 + 14X16 = (574) 10111 1) 2 = 1X22+1X2+1X2O = 23-1 = (7) 10(2)将十进制数转换成任意进制数十进制数转换成二进制数的规则为:将十进制的数字除以2,得到的商数继续除以2,直到商为0, 然后将各次相除所得的余数从后往前排列,就得到该十进制数转换成的对应的二进制数。例如,将十 进制数13转换成二进制数的过程如下:2113216 1213 0211 10 1所得的余数从后往前排列,得到二进制数11

12、01,与表1中的一致。同理,可以得出将十进制数转换为任意进制数的规则。例如,将十进制数13转换成八进制数的 过程如下:8 1138 I 1501所得的余数从后往前排列,得到二进制数15,与表1中的一致。(3)二进制与八进制、十六进制之间的转换从表1中可以看出,每个八进制数的单个数字都可以用三位二进制数来表示,最大的八进制单个 数字7等于最大的三位二进制111,最小的八进制单个数字0等于最小的三位二进制000。因此,每 个八进制数的单个数字都可以用三位二进制数字来表示,即23=8。同样,每个十六进制数的单个数字 都可以用四位二进制数来表示,即24=16。例如,将八进制数13转换成二进制数的过程如

13、下:(1 3) 8 = (001 011) 2从以上的转换过程看出,将每个八进制数字转换成了三位二进制数字,1转换成001, 3转换成 011,因此八进制13对应的二进制数字为1011现举例说明将十六进制数数E3转换成二进制数的过程:(E3) |6 = (11100011) 2从表1可以看出,十六进制数字E等于二进制的1110, 3等于二进制的0011,于是十六进制数字 E3等于二进制数字11100011。反过来,将二进制转换成八进制、十六进制,只需将从右边起的每三位或者每四位二进制数转换 成对应的八进制数或十六进制数。进制的常见错误:1 .八进制数据中出现8,甚至是9.2 .十六进制中,把1

14、5当成一个字符(实际上应该是f)。2、整型常量 在C语言中,整型常量分为十进制整型常量、八进制整型常量和十六进制整型常量三种表示形式。注意,在C语言中没有直接表示二进制的整型常量。(常考)(1)十进制整型常量由一串连续的。9数字组成。如:0、120、365、-12等。(2)八进制整型常量以数字0开头,其中的数字为07。如:0112 (十进制74)、0123 (十进制 83)、077 (十进制63)等。(3)十六进制整型常量以Ox (数字0和字母x)或0X开头,其中的数字可以是09、af或A-F 中的数字或英文字母。如:0x11(十进制17)、Oxa5(十进制165)、0X5a(十进制90)等。

15、整型常量又分为短整型(short int),基本整型(int)、长整型(long int)和无符号整型(unsigned) 等几类。例1:以下选项中可作为C语言合法整数的是A) 10110B B )0386C) OXffa D) x2a2分析:本题答案为C。选项(A)不是C语言中三种整型常量之一。选项(B)不是合法的八进制整型常量,因为八进制整型常量中不可能出现“8”字符。选项(D)中x2a2前加上“0”就是一个合法的十六进制整型常量。3、整型变量整型变量是用于存放整型值的变量。对应于整型常量,整型变量也可分为短整型(short int)、基 本整型(int),长整型(longint)和无符号

16、整型(unsigned)四种。定义基本整型变量用关键字ini,形式如下:int i;int类型所占据的字节长度因不同类型的机器或编译器而有所不同:如果使用VC+6.0,则会为int型变量分配4个字节长度的存储单元。我们使用的将是这种情况。如图1所示。图中表示对定义的int型整型变量i分配了四个字节的存储单元,这个存储单元的 名字为i,里面的内容不确定。图1计算机系统为整型变量i分配的内存空间当对变量i赋值时,这个值就存储在这个存储单元中。例如,执行了赋值语句:i=6;则变量i的存储单元变为如图2所示的情况。图2十进制整数6存放在变量i的内存空间中的形式正如读者所知,在计算机中实际上是以二进制形

17、式存储数据的,所以在变量i的存储单元中存放 的是四个字节的二进制数00000000 00000000 0000000000000110 (十进制6)oC语言中规定,在定义变量的同时给变量赋初值,称为变量初始化。例如:main() int a=2,b=3,c=4;表2不同类型的整型数在内存中所占用的字节数和数值范围数据类型关键字占用的字节数数值范围短整型signed short intj23276832767无符号短整型unsigned short int2065535基本整型signed int4-21474836482147483647无符号整型unsigned int40429496729

18、5长整型signed long int4-21474836482147483647无符号长整型unsigned long int404294967295说明:1)如果要表示一个长整型常量,则应该在对应的整型常量后面加上一个字母后缀KL的小写)或 者是L。如0L、110L、123L等。这是因为如果不加上L(或1),则表明这个整型常量为基本整型常量, 在内存中占两个字节的存储单元,而加上之后,则表明为长整型常量,在内存中占四个字节存储单元。2)无论是短整型还是长整型常量,C语言系统都默认为是有符号整数。无符号整数在数字的后 面加上一个字母后缀u或者是U。若是长整型无符号整型常量,则应该加后缀lu或

19、者是LU。例2:以下选项中不属于C语言的类型的是A) signed short intB) unsigned long intC) unsigned intD) long short分析:根据表2可知,正确答案为D。4、整数在内存中的存储形式在计算机内存中最小存储单位称为“位(bit)”。每一个位中或者存放0,或者存放1,因此称为 二进制位。一个字节(Byte)有8个二进制位。沿用惯例,把最右边一位称为最低位,把最左边一位 称为最高位。在C语言中,对于有符号型整数,将最高位作为符号位,当最高位为。时表示正整数, 当最高位为1时表示负整数。下面介绍整数的存储形式。注意:计算机中(或者说内存中)的

20、数据都以它对应的陋形式存在。第三节实型数据知识点:实型的定义方法和实型常量的表达方法;重要程度:1、实型常量在C语言中,实型常量有两种表示形式:小数形式和指数形式。(1)小数形式规则如下:1.有且仅有一个小数点。2.左边和右边可以有一边没有数据,但是不能同时没有数据。如:3.141590.15812.360.0-18.0(2)指数形式(E前E后都有数,E后必为整数)规则如下:1.有且仅有一个字母e (或者E)。2 .左右两边都必须有数据3 .左边可以是整数也可以是小数。4 .右边只能是整数。以下列举出几个正确的指数形式:le5(表示数值IxlO5)1.25E+4(表示数值 1.25xl()4)

21、2.0E-3(表示数值 2.0xl() 3)实型常量的常见错误:12(缺少小数点,12其实为一个整型的常量而不是实型常量)e5(缺少小数部分)1.25E(缺少指数部分)2.0E1.3(指数部分不是整数)例1:以下选项中合法的实型常数是A) 5E2.0 B) E-3C) .2E0 D) 1.3E分析:本题的答案是C。选项(A)的指数部分不是整数。选项(B)缺少小数部分。选项(D)缺少指数部分。例2:以下选项中,不能作为合法常量的是A) 1.234e04 B) 1.234e0.4 C) 1,234e+4 D) 1.234e0分析:选项(B)的指数部分不是整数,所以答案为B,其它选项均为正确的常量。

22、2、实型变量C语言中,实型变量分为单精度实型(float)变量与双精度实型(double)变量两种。它们定义 的形式分别如下:float x,y,z;/*定义单精度实型变量x,y,z */double a,b,c;/*定义双精度实型变量a,b,c*/double的精度比float好!第四节字符型数据知识点:字符型常量;字符型变最;转义字符:重要程度:(字符可当作整型使用)1、字符常量字符常量是由一对单引号括起来的。1)由一对单引号括起来的单个字符:单引号中只有一个字符:0 A a#2)由一对单引号括起来的,里面是由斜杠“”引起的若干字符:在单引号中,都由“开头:-、N、V、V,377 Wo这个

23、称为转义字符。转义字符后面的内容失去了原来的意义,如、表示换行符,而不是字母n 了。每个字符都有一个ASCH码与之对应。(字符可以看成整形)如字符。的ASCII码值为48,我们简称字符(T的值为48。同样,W的值为65,卬的值为97。字符型数据进行运算,使用的其实都是这个字符对应的ASCH码值。C语言中一共有三种转义字符:一般转义字符、八进制转义字符、:六进制转义字符。表3 C语言中常用的转义字符字符形式意义字符形式意义n换行一个反斜杠字符t横向跳格(Tab)X1一个单引号v竖向跳格V一个双引号b退格符(backspace)ooo13位八进制数代表的字符r回车符xhh12位十六进制数代表的字符

24、f换页符0空值(1) 一般转义字符V, N、等,由一个“”开头加一个普通字符组成。请牢记表3中粗体的转义字符。(2)八进制转义字符它是由“”与其后的13位八进制数字构成的字符序列。反斜杠后面的十六进制数不需要以0开头。就错了、6:首先把61这个八进制化成十进制,得至IJ49, ASCII为49的字符就是,.-or首先把101这个八进制化成十进制,得到65, ASCH为65的字符就是,AL .(3)十六进制转义字符它是由“x”与其后的12位十六进制数字构成的字符序列。反斜杠后面的十六进制数不需要以Ox开头。,0x77,错了 !但是反斜杠之后的必须是小写字母x,而不能是大写字母X,也不能是其它形式

25、。,0X77,错了!”42,表示字符常量B6e,分别表示字符常量和字符型常量的常见错误:(1)把a”看作字符常量。字符常量的标志是一对单引号、而不是双引号(2) 一对单引号中有多个字符。65,是非法的字符常量。(常考)(4) ooo中出现数字8。ooo中只能出现字符07。(5) xhh中,忘记书写字符X。例1:以下不合法的字符常量是A 018 B V C, D xcc分析:本题是2006年4月考题,考察点在字符常量的概念。此题答案为A。A中为八进制转义字符,但是八进制数不能出现8,因此错误。B中是一般转义字符,表示一个双引号字符,正确。C中是一般转义字符,表示一个反斜杠字符,正确。D中匹配十六

26、进制转义字符,cc是合法的十六进制数,正确。2、字符变量(考试重点)char a:等价于 char aa=A,;a = 65;变量a中存放了A的ASCII码值65。前面已经知道,字符型数据都是被处理为整型量,因此, 可以直接对字符变量赋字符常量对应的ASCII码值。如赋值语句a=65;与赋值语句a=W;等价。例2:已定义c为字符型变量,则下列语句中正确的是A) c=97; B) c=97;C) c=97;D) c=a;分析:答案选择C。A中97%非法的字符常量。单引号内不能出现多个字符。B中97为字符串,字符常量的标志的一对单引号,而不是双引号。C将整型量97赋给字符变量c,即将ASCH码值为

27、97的字符常量言赋给变量c,正确。D中a不是字符常量,而是字符串。3、对字符型数据的运算1、对字符进行算术运算就是将字符对应的ASCII码值进行运算。如:D-C的值为lo因为我们用D和C的ASCII码68、67分别替换D、C之后,等价于求6867 的值。乂例如,C+1的值为2、大写字母的ASCII码与对应的小写字母的ASCII码相差32o大写字母转换成小写字母A加上 32a如A与区的ASCII码分别为65和97。这样我们经过简单的算术运算就可以进行大小写字母字符 的转换。如火+32即为,区-32即为3、字符数字的ASCII码与对应的数字的ASCII码相差了 48.字符数字转换成数字T减去481

28、第五节算术表达式知识点:运算符号的优先级别:强制类型转换的使用:重要程度:1、算术运算符与算术表达式1、在C语言中,有下列五个基本的算术运算符:+、-、*、/和,依次表示加、减、乘、除、求 余运算。(考得最多的是/和窗!)2、求余运算符的运算对象只能是整型,即左侧的被除数与右侧的除数都只能为整型值。求余得到的运算结果的符号与被除数相同。(3% 1.2错了)如:12%9运算结果为3, 12%-9的运算结果也为3。-12%9运算结果为-3, -12%-9的运算结果也为-3。3、求余就是求余数,而不是求商,这点总是容易被弄混淆。令 想一想:3%9运算结果为多少?(结果为3而不是0)4、1/2得到的数

29、据是为0的,这个原则是当除号/“左右两边都为整数的时候,我们遵守取整丢 小数的原则。那么如果希望1和2相除得到0.5,我们就可以用1.0/2,或者1/2.0,或者1.0/2。都可 以实现。先面通过一个具体例子的分析,我们来彻底搞清楚算术运算符的运算规则。 例 1:试求 1.6+3/2* 1.2-3/2.0 的值步骤: 计算过程:说明:第一步:1.6+1*1.2-3/20根据运算优先级和结合的顺序,先算3/2,注意到它们为整型数据相运算,因此结果应为整数1,而不是1.5。第二步:1.6+1.0*1.2-3.0/20第三步:1.6+1.2-1.5第四步:2.8-1.5第五步:1.31*1.2为整型

30、和实型数据相运算,因此,会把整型数据1转换 为对应的实型数据1.0,再与1.2进行运算。同理,3变成3.0 分别计算出10*1.2和3.OZ2.O的结果 同一优先级的运算,从左到右依次进行 结果为1.3,而不是1.9A) 4.3 B) 4.8 C) 3.3D) 3.8下面,大家自己算算,表达式3.6-5/2+1.2+5%2的值应该是多少?分析:根据表3列出的算术运算符优先级,本题目应先计算5/2与5%2得到2和1,然后再计算 3.6-2+1.2+1,得到答案 D。2、强制类型转换在进行算术运算时,如果希望将某一运算量转换成指定的类型,则可以利用强制类型转换符。 强制类型转换表达式为:(类型名)

31、表达式其中,“(类型名)”是强制类型转换符,它将右边表达式的类型转换为括号中的类型。强制类型转换并不会改变右边表达式的值,(类型名)表达式这个整体产生了一个临时值。例:有如下代码:float a=3.8;int b;b=(int)a;这段代码把a强制转化为整型数据3 (注意C语言里的强制转换都是截取,而不是四舍五入), 并把这个值3赋给整型变量bo注意,此时a的值仍然是3.8o强制转换只控制其后的一个数据例:(int) a+b 和(int) (a+b)不同:前者是把a强制转换为整型,再把这个临时的整型值和b作运算。后者是先计算a+b,之后把它们的值做整体的强制转换。强制转换需要注意的几点:1)

32、类型名外的()必不可少2)强制转换控制其后的一个数据3)强制类型转换并不会改变右边表达式的值第六节赋值表达式知识点:赋值表达式的运算;复合赋值表达式的运算;自加和自减;重要程度:1、赋值运算符和赋值表达式int a = 12;它的含义是将赋值运算符右边的表达式的运算结果赋值给左边的变量。说明:1)赋值运算符左边必须是单个变量。例如x+l=3在数学上虽然是正确的,可是在C语言中却 是错误的,不能将一个常量赋值给一个表达式。2)赋值运算会将左边变量的值用右边表达式的值来代替,右边的值不会改变。例如,int x=3,y=5;x=y+1;以上代码先将x初始化为3,将y初始化为5o执行完赋值语句x=y+

33、l;后,变量x的值被y+1覆 盖掉,即x的值变成了 6,变量y的值不会改变。用盒子理论来说就是,先定义了两个盒子,分别叫做x盒子和y盒子,x盒子装的是整数3, y盒 子装的是整数5。之后把x盒子所装的内容改成y盒子的内容加1,也就是6。这样,x盒子中装的就 是6 了,以后再要使用x,都是用的新值6。而以前x装过什么值现在再也不知道了。3)赋值表达式的值是赋值号左边变量被赋值后的值。例如:x=0整个赋值表达式的值是变量x被赋值之后的值,也就是说这个表达式的值为0。4)可以将赋值表达式的值再赋值给变量,形成连续赋值运算。(学会分析过程)例如,x=(y=25)是一个连续赋值表达式。由于赋值表达式的结

34、合形式是从右到左,因此可以简写 为x=y=25,它表达的含义是将25赋值给变量y,然后将表达式y=25的值赋值,即变量y的值赋给变 量x,结果使变量x和y的值都变为25。5)虽然可以连续赋值,但是不能连续初始化。(考试重点)例如:intx=y=25;就是错误的。对于intx=y=25;我们会先计算y=25,此时,y并没有定义,而是在直接使用,所以就会报错。如果我们把上面的连续初始化改成:int y; int x=y=25;这样就没有错了。6)赋值运算符不同于数学上的“等号”。(C语言中“=”表示赋值,=”表示等号)因为赋值运算符的操作是将赋值号右边的表达式的值赋给左边的变量。它是单方向的操作。

35、例如 在数学中,i=i+l不成立,但在赋值表达式中却是成立的,它表示将变量i的值增加1之后得到的结果 赋值给变量i,因此,该表达式的含义是使变量i的值增加1。7)如果赋值号两边的运算对象类型不一致,则系统会自动进行类型转换。8)自动类型转换的实例:inta=3.6;赋值号左边的变量类型是整数,右边的值是实数,因此将右边的值转换成整数。3.6转换成整数 后是3,因此a的值被赋为了 3注意:实数转换成整数的方法是截取而不是四舍五入,因此直接把小数点后的数据去掉就行了。2、复合赋值表达式(掌握如何计算即可)在C语言中,可以将算术运算符与赋值运算符组合在一起组成复合赋值运算符。它们是:+=,-=,*=

36、, /=,其使用方法及具体的运算规则如下:表达式n+=l00等价的表达式为:n=n+100表达式n-=2*n等价的表达式为:n=n-2*n表达式n*=m+l等价的表达式为:n=n*(m+l)表达式n/=m+l等价的表达式为:n=n/(m+l)上述四种复合赋值运算符的运算优先级与赋值运算符的优先级相同(优先级都非常低),运算方 向均为自右向左。想一想:n+=10和n+10有什么区别?区别在于前者n本身的值改变了,而后者n的值没有改变。例1:已知变量n的初始值为8,计算表达式n+=n*=n-2的值。(经典考题)分析:表达式中有两个复合赋值运算符:+=和*=。它们优先级相同,运算方向均为自右向左。因

37、 此,运算的步骤如下:(1)先计算最右边表达式n-2的值为6;(2)再计算n*=6,该表达式等价n=n*6,将n中的值8乘以6,得到48,并赋值给n,因此变 量n的值为48,表达式n*=n-2的值为48;(3)最后计算n+=48,该表达式相当于n=n+48。因为上一步计算出n的值为48,所以n+48的 值为96,即n的值最终为96。通过计算,表达式n+=n*=n-2的值为96例 2: int a=5,b=6,c=2;c *=a+b;请问:c的值最终是多少?错误的算法:c=c*a+b;得到的是16o正确的算法:c=c*(a+b):得到的是22。第七节自加表达式1、自加与自减运算符(超级重点)如何

38、让一个变量自身的值加1?通过之前的学习,我们知道a=a+l;和a+=l;都可以实现。而我 们将要讨论的a+和+a同样可以实现这样的效果。自加、自减运算是一种赋值运算。既然a+和+a写法上有区别,那么它们应该有所不同。这里仅就+运算符进行说明,-运算符 有类似的结论:a+和+a的相同处:对于变量a而言,它们都是让a的值加1。a+和+a的不同处:(+a)、(a+)是两个自加表达式,所以这两个表达式本身就有数值,只是 +a, a+两个的表达式的数值不同。自加表达式的核心理解+a是先把a加1,再作为(+a)这个表达式的数值。a+是先把a的数值作为(a+)这个表达式的数值,再使a自加1。令 遇到a+,就

39、看成a,等这部分执行结束后,再让a的值加一。(加号在后,则先使用后自加)令遇到+a,则把a的值先加一,之后再使用加过一后的值。(加号在前,则先自加后使用)。例如有以下代码(通过以下代码,学会分析a+和+a的执行过程):int a=3,b;b=a+;这段代码执行完后,b的值为3, a的值为4。对于语句6=2+;按照以上所说,我们就看成b=a;此时a值为3,因此赋值后b的值也为3。等 这部分执行结束后,再让a的值加一。因此,整个这段代码结束后,b的值为3, a的值为4。int a=3, b;b=+a,代码发生了变化,那么执行完后,a和b的值分别为多少呢?对于语句b=+a;按照以上所说,我们把a值先

40、加一,得到a的值为4。之后赋值给b。因此,整 个这段代码结束后,a、b的值都为4。通过以上的简单例子,我们看到,a+和+a都会让a本身的值加一。不同在于对别人的影响。语句b=a+;等价于以下两条语句:b=a; a+;(先使用(赋值),后自力口) 语句b=+a;等价于以下两条语句:a+; b=a;(先自加,后使用(赋值)补充考点:1)增量运算符的运算对象只能为单个变量,不能是常量或是表达式。例如:+3、+ (i+1) 都是不合法的增量表达式。2)不论“+”在变量的前面还是在变量的后面,对于变量本身都具有“增加1”的相同效果。 例如iH、+两个增量表达式运算后变量i的值都是增加lo3)自加、自减运

41、算符的结合方向是“从右到左例如有如下代码:int y,x=3;y=-x+;负号与自加运算符“+”具有相同的运算优先级,但是根据“从右到左”的结合方向,那么 应该先计算X+,而X+可以先看成就是X。取其负值3赋给y,那么y的值就为-3,这部分执行结束 了,x的值再加一,所以这段代码结束后,x的值为4, y的值为-3。4)在使用“+”运算符时,变量应该有个确定的值。例如:inta;a+;就是错误的。因为刚定 义好的a值不确定。让一个垃圾值自加一没有任何意义。经典考题:例1:有以下定义语句:double a,b; int w; long c;若各变量已正确赋值,则下列选项中正确的表达式是A) a=a

42、+b=b+ B) w%(int)a+b) C) (c+w)%(int)a D) w=a%b;分析:答案C正确。选项A是一个连续赋值表达式,先将表达式b+的值赋值给表达式a+b,因为赋值语句的左边只 能是变量名称,因此这时会出错。选项B是一个求余运算符连接起来的两个运算对象,除数(int)a+b)看起来比较复杂,它先将双精 度类型变量a的值强制转换为整型,然后再与双精度类型变量b求和,得到的值的类型仍为双精度类 型,也就是说除数是一个实数而不是整数,因此不能使用运算符,所以答案B错误。选项C的被除数是两个整型数相加,运算结果为整型,除数为(int)a,也为整型,答案C正确。选项D中a%b错误。例

43、2有以下程序 main() int m=12,n=34;printf(d%d”,m+,+n);printf(H%d%dn,n4-+,-H-m);程序运行后的输出结果是A) 12353514 B) 12353513 C) 12343514 D) 12343513分析:在第一个printf输出语句中,计算表达式m+时,其值为变量m的初始值,即12,因为 执行了表达式m+,变量m的值增加1,因此m的值变为13。计算表达式+n时,其值为变量n的 初始值增加1,即35,因为计算了表达式+n,因此变量n的值增加1,为35。在第二个printf中, 计算n+时,其值为n的初始值,即上一次计算得到的35,因为

44、计算了 n+,变量n的值增加1。计 算+m时,其值为变量m的初始值增加1,即使上一次计算得到的m的值加上1,为14。因此本题 答案为Ao第八节逗号表达式5、逗号运算符和逗号表达式1、在C语言中,逗号除了做分隔符,还可以作一种运算符逗号运算符。用逗号运算符把两 个或两个以上的表达式连接起来,可以构成一个新的表达式,即逗号表达式。例如:x=5,y=6,z=7 整个(x=5,y=6,z=7)是逗号表达式,他的数值等于7,2、逗号运算符是级别最低的运算符号,比赋值还要低。3、逗号运算符具有从左到右的结合性,即先计算第一个表达式,然后计算第二个表达式,直到 最后一个表达式。最后一个表达式的值就是整个逗号

45、表达式的值。上述的逗号表达式的值就是表达式 z=7的值7。x=5,y=6,z=7是个逗号表达式,它的数值为7。x的数值为5。x= (5,y=6,z=7)是个逗号表达式,它的数值为7, x的数值为7。例1:有以下程序 main() int al=3,a2=9;printf(%dn,(al,a2);)以下叙述中正确的是A)程序输出3B)程序输出9C)格式说明符不足,编译出错D)程序运行时产生出错信息分析:函数体中首先变量初始化,变量al、a2的值分别为3和9,接下来的printf输出语句中, 要输出的项是(al,a2),在此要明白输出项是一个逗号表达式就不会选错答案。逗号表达式al,a2的值 就是

46、a2的值,因此本题的答案为B。请注意它与printf(%dn”,al,a2)的区别。例2:有以下程序(经典考题)main() int x,y,z;x=y=l;z=x+,y+,+y;printf(%d,%d,%dn”,x,y,z);程序运行后的输出结果是A) 2, 3, 3 B) 2, 3, 2 C) 2, 3, 1 D) 2, 2, 1分析:函数体中首先定义了三个整型变量x, y和z,接下来,对变量x和y赋值为1。然后,仔细分 析语句z=x+,y+,+y;,因为逗号运算符在所有运算符中的优先级最低,因此赋值表达式应该先于逗 号表达式计算,所以上述逗号表达式语句由三个赋值表达式组成:z=x+、y

47、+和+y。按逗号表达式 的计算规则,从左至右依次计算每个表达式,故应先计算x+,并将其值赋给变量z, z的值为1,因 为计算了 X+, X的值增加1,变为2;计算了 y+和+y,变量y的值应增加2,变为3。最后,程序 输出x,y,z的值应为2, 3, 1。本题答案为C。补充:int a=l x;x为3.x为1x= ( a+, a+, +a)后,x的数值为多少?int a=l* x;x=a+, a+, +a后,x的数值为多少?第二章顺序结构该章内容:这章我们学习三大结构之一:顺序结构,它是程序从上往下顺序执行,是程序运行最简单的方式。printf和scanf 函数使用和特例是必考知识.本章是考试

48、的重点章节。学习方法:从简单的顺序结构题目入手,逐步把难度加大,对比记忆printf和scanf函数。第一节表达式与语句知识点:语句和表达式之间的联系;分号的使用:复合语句重要程度:1、表达式与语句“表达式“ + ” ; “ = ”语句二例如:赋值表达式 赋值语句算术表达式 算术语句自加表达式自加语句x=9X=9:x+yx+y;i+i-H-:从图中可以很清楚的看见,表达式和语句的区别就是一个有分号,一个没有分号。这个分号是考 试的重点,尤其是在上机考试的改错题目,最喜欢不写分号,我们要加个分号!2、空语句与复合语句1、这个分号也是一个语句,称为“空语句”。“空语句”表示程序执行时不产生任何动作

49、。注意: 随意使用空语句会导致逻辑上出现错误,需要慎用。2、所谓复合语句,就是把好几个语句复合到一起,那么用什么符号把多个语句复合到一起来? 我们要记住是用花括号把多个语句括起来组成了一个复合语句。复合语句具体形式:语句1;语句2; 语句n; 3、顺序结构程序中的多个语句按照语句从上往下出现的先后次序顺序逐条执行,这种执行方式是最基本的执 行方式,称为顺序结构,是三大基本结构之一。记住一句话:看到顺序结构就想到从上往下。第二节数据输出考 点:pimtf函数的使用:printf两个参数的使用方法;格式说明符号对应的意思:重要程度:(每年必考)printf函数和scanf函数都是库函数,print

50、f和scanf都不是关键字,他们只是预定义标识符。1、printf函数第一个参数讲解例 1: printf(x=%d,y=%d,l,2);第一个部分是用双引号括起来!第二部分是两个数据“1,2”,数据之间是用逗号隔开的。第一部分的双引号中就有两种信息:一种是原样输出,一种是格式说明“其中原样输出的说明信 息是“x=,y= ,包括第一个d之后的逗号也是原样输出。双引号中还有两个d,这两个d就是格 式转换说明,用于指定第二部分数据“1,2”的输出格式为整型。这里第一个“d”对应第一个数字 1,第二个“d”对应第二个数字2,因此我们可以在屏幕上看到:x=l, y=2o例 2: printffthe

51、result is %d”,123);这个程序中运行结果是可以在屏幕上看到:the result is 123。那么原样输出的说明信息是“the result is”,第一个部分的d是要把输出数据列表的123以整型的格式输出。例 3: printf(x=%d,y%d,l,2);这个程序运行的结果是可以在屏幕上看到:x=l,y2。那么我们可以看到比例一中的第一部分,我 们少了个等号“=,所以我们在输出时候,原样输出的信息就没有等号2、printf函数第二个参数讲解printf函数第二个参数可以是常量数据,也可以是变量,也可以是表达式。例 4: printf(x=%d,l);printf(x=%d

52、,x);printf(x=%d,x+y);输出数据列表是常量 输出数据列表是变量 输出数据列表是表达式屏幕显示:x=l若x为9,屏幕显示:x=9若x+y为12,屏幕显示:x=12第二个要记住的:各个数据之间用逗号分隔开。第三个要记住:输出数据的个数与输出控制中的格式转换说明的个数相等,并且在顺序上要一一 对应且类型匹配。注意一点:如果类型不匹配,这时系统并不报错,但不能得到正确的结果。例 5: printf(%d,%f, 9.87,2);这里是不会报错的,但是得不到正确的结果,因为,第一个格式说明“d”表示要把输出数据 按整数形式输出,而它对应要输出数据却是实数9.87,对应出错了。第二个格式

53、说明“f”是要把输 出数据按实数形式输出,而第二个要输出的数据却是整数2,显然不匹配。在输出控制中,格式说明的个数(也就是第一部分d的个数)应与第二部分输出项的输出数据 个数相同。情况一:格式说明的个数 输出项的个数,处理方式:对多于的格式说明将输出不定值。情况二的例子:printf(M%d,%dn, 2);的输出结果为2, 772。第二个数据是不定值。例6:有以下程序(常考题型)main() int a=888,b=999;printf(M%dnn,a,b);程序运行后的输出结果是A)错误信息 B)999C)888D)888,999分析:在printf语句中,格式控制的格式说明只有一个“d”

54、,但是而输出列表项有两项“888,999”, 即a和b。由于只有一个d,输出的结果只有一个,即printf函数的第二部分中第一个出现的变量a 的值。则正确的答案是:Co3、printf函数中的格式说明前面的例子中多次出现了由“”加上一个字符的组成的格式转换说明,它是作为printf的输出 控制的。这个是一定要牢记的,是考试的重点!表1格式说明对应的输出数据格式格式说明%d 或%i%f%c%o%x 或%X%#o%#x 或#X%u%e 或%E说明:输出数据格式输出有符号的十进制整型数输出单精度或双精度数且小数点后有6位小数数位输出一个字符输出八进制无符号形式整型数(不带前导0)输出十六进制无符号形

55、式整型数(不带前导Ox或0X)输出八进制无符号形式整型数(带前导0)输出十六进制无符号形式整型数(带前导Ox或0X)输出无符号的十进制整数以-m.ddddde土xx或m.ddddde土XX的形式输出单精度或双精度数。d的个数由精度决定。系统隐含的精度为6, d的个数隐含为5。1)对于长整型数据的输出,一定要在和d之间加上英文小写字母1,即格式Id。2)对于双精度数据的输出,一定要在和f或e之间加上英文小写字母1,即格式If或le。3)用表1所列出的格式说明时,系统自动决定输出数据所占的宽度,并采用右对齐的方式。常考题型:例7:若有以下程序段(注意:n所赋的是八进制数)int x=32767,y

56、=032767;printf(%d,%on,x,y);执行后输出结果是A)32767, 032767 B)32767, 32767 C)32767, 77777 D)32767, 077777分析:整型变量x和y分别存放的是十进制整数32767和八进制整数32767。在printf语句中, 把x和y两个变量分别按d (十进制有符号的形式)和。(八进制无符号形式)形式输出。那么得 到的结果应该是32767, 32767,即答案B正确。例8:同例7相似,只是在printf函数中的o之间加上#,变为#o。int x=32767,y=032767:printf(%d,%#on,x,y);那么该例子得到

57、的结果为:32767, 032767,可以看到o与#o之间的区别。就是一个不要输出八进制中前导的0,而另外一个是要输出前导的0。例9:若有以下程序段int i=0xabc,j=0xabc;T;printf(H%Xnn,i);printf(n%#Xn,i);执行后输出结果是A) 0X0 B) 0x0 C) 0 D) OXABC000x0 OxABC分析:第一行:整型变量i和j里面存放的都是十六进制整数abc。第二行:执行i-寸语句,i值 变为0。第三行:在printf语句中,把i存放的整数0以X (十六进制无符号形式)形式输出,得到 的结果是0,第四行:把i存放的整数0以#X形式输出,得到的结果

58、是0x0。所以正确答案是C。例10:若变量a,b已定义为int类型并赋值22和66,要求用printf函数以a=22,b=66的形式输出, 请写出完整的输出语句分析:根据题目要求,变量a、b要求以int类型输出,从表1中可知:输出时应使用格式说明d 来对应整型,同时输出的形式为a=21,b=55,那么也就是有一部分的内容要原样输出。这些内容是 “a=,b=,所以在输出控制的双引号内,我们写上代码“a=%d,b=%d。最后,整个需要输出语句为: printf(a=%d,b=%d,a,b);重要说明:(考得很少)1)在和格式字符之间加入一个整数来控制输出数据所占的宽度,如5d,情况一:整数指定的宽

59、度大于实际输出数据的宽度。处理方式:数据的输出采用右对齐的方式, 左边自动补空格;情况二:整数指定的宽度小于实际输出数据的宽度。处理方式:以输出数据的实际宽度输出。表2举例说明了未指定宽度和指定宽度时的对比结果。表2未指定宽度和指定宽度时的输出数据对比结果(”代表空格)输出语句输出结果printf(%d,625);625printf(%2d,625);625printf(%5d,625);625printf(%f,1.25);1.250000printf(%6f,1.25);1.250000printf(%12f,1.25);1.250000说明:在输出时,小数点占一位,对于float和dou

60、ble类型一定要保证小数后是六位,不足的补0o2)在和格式字符f之间加入“整数1.整数2”来控制输出数据的格式时,如3.2f。“整数1”指定整个输出数据占的总宽度。“整数2”指定输出实数的小数部分的个数。情况一:当实际输出数据的小数个数“整数2”指定的个数时。处理方式:截去多余的数据, 并对截去的第一位小数做四舍五入处理。情况二:当实际输出数据的小数个数(“整数2”指定的个数时。处理方式:在小数的右边添0补足。重要的一句话:碰到“整数1.整数2”形式,首先用“整数2”处理小数部分,处理完后,在用 “整数1”处理整个数据,包括已经处理好的小数部分。表3 “整数1.整数2的输出格式(”代表空格)输出语句输出结果printf(M%3.3f;3.1415);

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!