1、http:/ C 语言基础知识该章内容:本章是整个 C 语言最基础的部分;表达式是 C 语言的核心,本章会学习到不同的表达式。学习方法:对关键的知识点一定要多背,把最基础的习题多做几遍,在以后的学习中要多次反回来复习,加深印象。第一节 C 语言的基本构成知识点:C 语言的注释;关键字;书写风格;常量和变量重要程度:1、C 语言的良好风格用 C 语言编写的程序,称为 C 语言源程序,简称 C 程序。本节将通过一个简单的 C 程序例子,向大家介绍 C 语言的一些基本构成和如何写出风格良好的程序,使读者对 C 语言有一个初步的认识。例 1:计算两个整数之和的 C 程序#include “stdio.
2、h“main( ) /*求两数之和*/int a,b,sum; /*变量说明*/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、关于注释的说明(考点一) 程序中以“/*”开头并且以“*/”结尾的部分表示程序的注释部分。 注释可以加在程序的任何
3、位置。 注释是为了提高程序的可读性而增加的,不属于 C 语言。 /*/*ddddddd*/*/ 这样的注释不是合法的。注释是从“/*“开始到”*/“结束的。以该例为准,属于注释的就是/* */两个之间的/*ddddddd,所以最后剩下的*/就是多余了。例 1: 阅读以下程序,想一想结果是多少?main( ) int a=0,b=0;a =10; /*给 a 赋值b=20; 给 b 赋值 */printf(“a+b=%dn“,a+b); /*输出计算结果*/这是 2006 年 9 月全国计算机等级考试二级考试的第 19 题。需要特别注意的是,程序第三行“/*”开始的注释部分,直到第四行末尾才结束
4、。因此上面的程序等价于以下的程序:新视野教育国家计算机二级考前冲刺资料-2main( ) int a=0,b=0;a =10;printf(“a+b=%dn“,a+b);3、标识符(考试重点)在 C 语言中用于标识名字的有效字符序列称为标识符。标识符可以用作常量名、变量名、符号名、函数名和后面要学到的指针名、数组名等。C 语言中标识符的命名规则如下:1)标识符只能由字母、数字和下划线组成;2)标识符的第一个字符必须是字母或下划线。3)标识符区分大小写字母。如 int 与 Int 是两个完全不同的标识符。合法的标识符:a x sum spels program ab1 _to file_5 a1
5、b2c3 _2 B3非法的标识符:ab12# (含有不合法的字符“#” )a1-c (含有不合法的字符“-” )ab c (空格不是合法标识符)r (“”不是字母,为不合法标识符字符)23ab (第一个字符不能为数字)C 语言的标识符分为如下三类:1)关键字关键字是具有特定含义的、专门用来说明 C 语言特定成分的一类标识符。关键字均由小写字母构成。Int 就不是关键字。2)预定义标识符预定义标识符(如 printf,scanf,sin,isalum 等)和编译预处理命令名(如 define,include 等) 。注意,预定义标识符可以作为“用户标识符”使用。3)用户标识符(考试重点)不能是关
6、键字;只能由字母、数字和下划线组成;第一个字符必须是字母或下划线。Int 可以作为用户标识符,int 就不可以作为用户标识符。考点:1. 识别哪些是(或不是)标识符2. 识别哪些是(或不是)用户标识符例 2: 以下不能定义为用户标识符的是A) scanf B) Void C) _3com_ D) int分析:本题答案选 D。因为 int 是关键字,关键字不能作为用户标识符。答案(A)的 scanf 虽然是预定义标识符,但是预定义标识符可以作为用户标识符使用。 (B)中 Void 的第一个字符 V 大写,它与关键字 void 是两个不同的标识符,故它可以作为用户标识符。 (C)中的_3com_符
7、合标识符的命名规则,且不是关键字,故可以定义为用户标识符。例 3:以下不合法的用户标识符是A) j2_KEY B) Double C) 4d D)_8_分析:本题答案选 C。答案(A)是一个用户标识符,符合标识符的命名规则。答案(B)也是用户标识符,需要注意的是,它与关键字 double 是两个不同的标识符。答案(D)是用户标识符,由数字和下划线组成,且第一个字符为下划线。只有答案(C)是不合法的用户标识符,因为它的第一个字符是数字,不符合标识符的命名规则。http:/ 标识符的常见错误:1. 数字开头2. 包含减号“-”3. 用户标识符使用的是关键字4、常量。C 语言中,还有另外一种常量是用
8、标识符命名的,称为符号常量。下面程序的 PI 就是符号常量。例 4: 计算圆面积的 C 语言程序#define PI 3.14159main( ) float r,area;r=12.5;area=PI*r*r;printf(“area=%fn“,area);程序的第一行是宏定义,以后遇到 PI 就用其后的内容3.14159 来原样替换。这里的 PI 就是一个符号常量。通常,符号常量用大写字母表示,但这并不是语法上的要求,只不过用大写字母书写符号常量,便于辨认。当进行宏定义后,程序中只要用到相应的数值常量都可以用符号常量代替,这就给程序的修改提供了方便。例如,如果需要进一步提高圆周率的精度,可
9、以直接修改宏定义中的数值常量:#define PI 3.1415926这样,程序中只要用到 PI 的地方,其值都自动变为 3.1415926。5、变量与常量对应的是变量。顾名思义,变量就是在程序的运行过程中其值可以改变的量。例 1 中的a,b 都是变量,它们是由用户定义的标识符,变量的命名必须遵循标识符的命名规则。用盒子的理论来描述:1) 变量就是盒子,里面装的内容可以改变。2) 通过赋值语句就可以改变盒子里的内容。3) 每次使用盒子时,盒子里都应该有确切的内容而不能是不确定的值。4) 每次使用盒子时,都是用的现在盒子里装的内容。以前装过什么内容没有任何影响。第二节 整型数据知识点:进制的转换
10、;整型的定义和使用;重要程度:在 C 语言中,有三种基本的数据类型,它们是整型、实型和字符型。1、数制转换二进制的数,基为二,某位出现的最大数字是 2-1=1;八进制的数,基为八,某位出现的最大数字是 8-1=7;十六进制的数,基为十六,某位出现的最大数字是 f(相当与十进制的 15) 。在十六进制中,数字由十六个代码组成,分别是 09 和 AF(或者是 af)这十六个代码。表 1 列举出十进制数字从 015 时,相应的二进制、八进制和十六进制数字。 (同列的为一组,表示相同的值)新视野教育国家计算机二级考前冲刺资料-4表 1 十进制、二进制、八进制和十六进制对照表十进制 0 1 2 3 4
11、5 6 7二进制 0 1 10 11 100 101 110 111八进制 0 1 2 3 4 5 6 7十六进制 0 1 2 3 4 5 6 7十进制 8 9 10 11 12 13 14 15二进制 1000 1001 1010 1011 1100 1101 1110 1111八进制 10 11 12 13 14 15 16 17十六进制 8 9 A B C D E F十进制的数字在我们日常生活中普遍使用,然而在计算机内部,数字均以二进制形式表示和存放。引例:(1)将任意进制的数转换为十进制数:将这个数按照引例中的方法展开。注意底数使用的是该进制的基。使用以上的方法,我们再来看两个例子:(
12、23E) 16 = 2162 + 3161 + 14160 =(574) 10(111) 2 = 122+121+120 = 23-1 = (7) 10(2)将十进制数转换成任意进制数十进制数转换成二进制数的规则为:将十进制的数字除以 2,得到的商数继续除以 2,直到商为0,然后将各次相除所得的余数从后往前排列,就得到该十进制数转换成的对应的二进制数。例如,将十进制数 13 转换成二进制数的过程如下:2 | 1 3 2 | 6 12 | 3 02 | 1 10 1 所得的余数从后往前排列,得到二进制数 1101,与表 1 中的一致。同理,可以得出将十进制数转换为任意进制数的规则。例如,将十进制
13、数 13 转换成八进制数的过程如下:8 | 1 3 8 | 1 50 1所得的余数从后往前排列,得到二进制数 15,与表 1 中的一致。(3)二进制与八进制、十六进制之间的转换从表 1 中可以看出,每个八进制数的单个数字都可以用三位二进制数来表示,最大的八进制单个数字 7 等于最大的三位二进制 111,最小的八进制单个数字 0 等于最小的三位二进制 000。因此,每个八进制数的单个数字都可以用三位二进制数字来表示,即 23=8。同样,每个十六进制数的单个数字都可以用四位二进制数来表示,即 24=16。例如,将八进制数 13 转换成二进制数的过程如下:(1 3) 8 = ( 001 011) 2
14、从以上的转换过程看出,将每个八进制数字转换成了三位二进制数字,1 转换成 001,3 转换成011,因此八进制 13 对应的二进制数字为 1011。现举例说明将十六进制数数 E3 转换成二进制数的过程:(E 3) 16 = ( 1110 0011) 2http:/ 1 可以看出,十六进制数字 E 等于二进制的 1110,3 等于二进制的 0011,于是十六进制数字 E3 等于二进制数字 11100011。反过来,将二进制转换成八进制、十六进制,只需将从右边起的每三位或者每四位二进制数转换成对应的八进制数或十六进制数。进制的常见错误:1. 八进制数据中出现 8,甚至是 9.2. 十六进制中,把
15、15 当成一个字符(实际上应该是 f) 。2、整型常量 在 C 语言中,整型常量分为十进制整型常量、八进制整型常量和十六进制整型常量三种表示形式。注意,在 C 语言中没有直接表示二进制的整型常量。 (常考)(1)十进制整型常量由一串连续的 09 数字组成。如:0、120、365、-12 等。(2)八进制整型常量以数字 0 开头,其中的数字为 07。如:0112(十进制 74) 、0123(十进制 83) 、077(十进制 63)等。(3)十六进制整型常量以 0x(数字 0 和字母 x)或 0X 开头,其中的数字可以是 09、af 或AF 中的数字或英文字母。如:0x11(十进制 17)、0xa
16、5(十进制 165)、0X5a(十进制 90)等。整型常量又分为短整型(short int) 、基本整型(int) 、长整型(long int)和无符号整型(unsigned)等几类。例 1: 以下选项中可作为 C 语言合法整数的是A) 10110B B) 0386 C) 0Xffa D) x2a2分析:本题答案为 C。选项(A)不是 C 语言中三种整型常量之一。选项(B )不是合法的八进制整型常量,因为八进制整型常量中不可能出现“8”字符。选项(D)中 x2a2 前加上“ 0”就是一个合法的十六进制整型常量。3、整型变量整型变量是用于存放整型值的变量。对应于整型常量,整型变量也可分为短整型(
17、short int) 、基本整型(int) 、长整型(long int)和无符号整型(unsigned)四种。定义基本整型变量用关键字 int,形式如下:int i;int 类型所占据的字节长度因不同类型的机器或编译器而有所不同:如果使用 VC+6.0,则会为 int 型变量分配 4 个字节长度的存储单元。我们使用的将是这种情况。如图 1 所示。图中表示对定义的 int 型整型变量 i 分配了四个字节的存储单元,这个存储单元的名字为 i,里面的内容不确定。图 1 计算机系统为整型变量 i 分配的内存空间当对变量 i 赋值时,这个值就存储在这个存储单元中。例如,执行了赋值语句:i=6;则变量 i
18、 的存储单元变为如图 2 所示的情况。00000000 00000000 00000000 00000110图 2 十进制整数 6 存放在变量 i 的内存空间中的形式新视野教育国家计算机二级考前冲刺资料-6正如读者所知,在计算机中实际上是以二进制形式存储数据的,所以在变量 i 的存储单元中存放的是四个字节的二进制数 00000000 00000000 00000000 00000110(十进制 6) 。C 语言中规定,在定义变量的同时给变量赋初值,称为变量初始化。例如:main( ) int a=2,b=3,c=4;表 2 不同类型的整型数在内存中所占用的字节数和数值范围数据类型 关键字 占用
19、的字节数 数值范围短整型 signed short int 2 -32768 32767无符号短整型 unsigned short int 2 065535基本整型 signed int 4 -2147483648 2147483647无符号整型 unsigned int 4 04294967295长整型 signed long int 4 -2147483648 2147483647无符号长整型 unsigned long int 4 04294967295说明:1) 如果要表示一个长整型常量,则应该在对应的整型常量后面加上一个字母后缀 l(L 的小写)或者是 L。如 0L、110L 、12
20、3L 等。这是因为如果不加上 L(或 l),则表明这个整型常量为基本整型常量,在内存中占两个字节的存储单元,而加上之后,则表明为长整型常量,在内存中占四个字节存储单元。2)无论是短整型还是长整型常量,C 语言系统都默认为是有符号整数。无符号整数在数字的后面加上一个字母后缀 u 或者是 U。若是长整型无符号整型常量,则应该加后缀 lu 或者是 LU。例 2: 以下选项中不属于 C 语言的类型的是A) signed short int B) unsigned long intC) unsigned int D) long short分析:根据表 2 可知,正确答案为 D。4、整数在内存中的存储形式
21、在计算机内存中最小存储单位称为“位(bit) ”。每一个位中或者存放 0,或者存放 1,因此称为二进制位。一个字节(Byte)有 8 个二进制位。沿用惯例,把最右边一位称为最低位,把最左边一位称为最高位。在 C 语言中,对于有符号型整数,将最高位作为符号位,当最高位为 0 时表示正整数,当最高位为 1 时表示负整数。下面介绍整数的存储形式。注意:计算机中(或者说内存中)的数据都以它对应的 补码 形式存在。第三节 实型数据知识点:实型的定义方法和实型常量的表达方法;重要程度:1、实型常量在 C 语言中,实型常量有两种表示形式:小数形式和指数形式。(1)小数形式规则如下:1. 有且仅有一个小数点。
22、2. 左边和右边可以有一边没有数据,但是不能同时没有数据。http:/ 0.158 12. .36 0.0 -18.0(2)指数形式(E 前 E 后都有数, E 后必为整数)规则如下:1. 有且仅有一个字母 e(或者 E) 。2. 左右两边都必须有数据。3. 左边可以是整数也可以是小数。4. 右边只能是整数。以下列举出几个正确的指数形式:1e5 (表示数值 1105)1.25E+4 (表示数值 1.25104)2.0E-3 (表示数值 2.010-3)实型常量的常见错误:12 (缺少小数点,12 其实为一个整型的常量而不是实型常量)e5 (缺少小数部分)1.25E (缺少指数部分)2.0E1.
23、3 (指数部分不是整数)例 1: 以下选项中合法的实型常数是A)5E2.0 B)E-3 C).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,其它选项均为正确的常量。2、实型变量C 语言中,实型变量分为单精度实型(float )变量与双精度实型(double )变量两种。它们定义的形式分别如下:float x,y,z; /*定义单精度实型变
24、量 x,y,z */double a,b,c; /*定义双精度实型变量 a,b,c*/double 的精度比 float 好!第四节 字符型数据知识点:字符型常量;字符型变量;转义字符;重要程度:(字符可当作整型使用)1、字符常量 字符常量是由一对单引号括起来的。1)由一对单引号括起来的单个字符:单引号中只有一个字符: 0、A 、a 、 、# 。2)由一对单引号括起来的,里面是由斜杠“”引起的若干字符:在单引号中,都由“”开头: n 、 t 、“、 0 、377 、xff 。这个“”称为转义字符。转义字符后面的内容失去了原来的意义,如n表示换行符,而不是字母 n 了。新视野教育国家计算机二级考
25、前冲刺资料-8每个字符都有一个 ASCII 码与之对应。 (字符可以看成整形)如字符0的 ASCII 码值为 48,我们简称字符0的值为 48。同样,A的值为 65,a的值为 97。字符型数据进行运算,使用的其实都是这个字符对应的 ASCII 码值。C 语言中一共有三种转义字符:一般转义字符、八进制转义字符、十六进制转义字符。表 3 C 语言中常用的转义字符字符形式 意义 字符形式 意义n 换行 一个反斜杠字符 t 横向跳格(Tab) 一个单引号 v 竖向跳格 “ 一个双引号 “b 退格符(backspace) ooo 13 位八进制数代表的字符r 回车符 xhh 12 位十六进制数代表的字符
26、f 换页符 0 空值(1)一般转义字符n、“ 等,由一个“”开头加一个普通字符组成。请牢记表 3 中粗体的转义字符。(2)八进制转义字符它是由“”与其后的 13 位八进制数字构成的字符序列。反斜杠后面的十六进制数不需要以 0 开头。 061就错了61首先把 61 这个八进制化成十进制,得到 49,ASCII 为 49 的字符就是1 。.101首先把 101 这个八进制化成十进制,得到 65,ASCII 为 65 的字符就是A 。.(3)十六进制转义字符它是由“x”与其后的 12 位十六进制数字构成的字符序列。反斜杠后面的十六进制数不需要以 0x 开头。 0x77错了!但是反斜杠之后的必须是小写
27、字母 x,而不能是大写字母 X,也不能是其它形式。 0X77错了!x42表示字符常量 B x6e分别表示字符常量和n。字符型常量的常见错误:(1)把“a“看作字符常量。字符常量的标志是一对单引号 ,而不是双引号“ “ 。(2)一对单引号中有多个字符。65是非法的字符常量。 (常考)(4)ooo中出现数字 8。ooo中只能出现字符 07。(5)xhh 中,忘记书写字符 x。例 1: 以下不合法的字符常量是A 018 B C D xcc分析:本题是 2006 年 4 月考题,考察点在字符常量的概念。此题答案为 A。A 中为八进制转义字符,但是八进制数不能出现 8,因此错误。B 中是一般转义字符,表
28、示一个双引号字符,正确。C 中是一般转义字符,表示一个反斜杠字符,正确。D 中匹配十六进制转义字符,cc 是合法的十六进制数,正确。2、字符变量(考试重点)char a: 等价于 char aa=A; a = 65;变量 a 中存放了A的 ASCII 码值 65。前面已经知道,字符型数据都是被处理为整型量,因此,http:/ ASCII 码值。 如赋值语句 a=65;与赋值语句 a=A;等价。例 2: 已定义 c 为字符型变量,则下列语句中正确的是A) c=97; B) c=“97“; C) c=97; D) c=“a“;分析:答案选择 C。A 中97为非法的字符常量。单引号内不能出现多个字符
29、。B 中“97“为字符串,字符常量的标志的一对单引号,而不是双引号。C 将整型量 97 赋给字符变量 c,即将 ASCII 码值为 97 的字符常量a赋给变量 c,正确。D 中“a“不是字符常量,而是字符串。3、对字符型数据的运算1、对字符进行算术运算就是将字符对应的 ASCII 码值进行运算。如:D-C的值为 1。因为我们用 D和C的 ASCII 码 68、67 分别替换D、C 之后,等价于求 68-67 的值。又例如,C+1 的值为D。2、大写字母的 ASCII 码与对应的小写字母的 ASCII 码相差 32。大写字母 转换成 小写字母A 加上 32 a如A与a的 ASCII 码分别为 6
30、5 和 97。这样我们经过简单的算术运算就可以进行大小写字母字符的转换。如A +32 即为,a-32 即为A。3、字符数字的 ASCII 码与对应的数字的 ASCII 码相差了 48.字符数字 转换成 数字1 减去 48 1第五节 算术表达式知识点:运算符号的优先级别;强制类型转换的使用;重要程度:1、算术运算符与算术表达式1、在 C 语言中,有下列五个基本的算术运算符:+、-、*、/和%,依次表示加、减、乘、除、求余运算。 (考得最多的是/ 和%符号!)2、求余运算符%的运算对象只能是整型,即% 左侧的被除数与右侧的除数都只能为整型值。求余得到的运算结果的符号与被除数相同。 (3%1.2 错
31、了)如:12%9 运算结果为 3,12%-9 的运算结果也为 3。-12%9 运算结果为 -3,-12%-9 的运算结果也为-3 。3、求余就是求余数,而不是求商,这点总是容易被弄混淆。 想一想:3%9 运算结果为多少?(结果为 3 而不是 0)4、1/2 得到的数据是为 0 的,这个原则是当除号“/“左右两边都为整数的时候,我们遵守取整丢小数的原则。那么如果希望 1 和 2 相除得到 0.5,我们就可以用 1.0/2,或者 1/2.0,或者 1.0/2.0 都可以实现。新视野教育国家计算机二级考前冲刺资料-10先面通过一个具体例子的分析,我们来彻底搞清楚算术运算符的运算规则。例 1:试求 1
32、.6+3/2*1.2-3/2.0 的值下面,大家自己算算,表达式 3.6-5/2+1.2+5%2 的值应该是多少?A)4.3 B)4.8 C)3.3 D)3.8分析:根据表 3 列出的算术运算符优先级,本题目应先计算 5/2 与 5%2 得到 2 和 1,然后再计算 3.6-2+1.2+1,得到答案 D。2、强制类型转换在进行算术运算时,如果希望将某一运算量转换成指定的类型,则可以利用强制类型转换符。强制类型转换表达式为:(类型名)表达式其中, “(类型名) ”是强制类型转换符,它将右边表达式的类型转换为括号中的类型。强制类型转换并不会改变右边表达式的值, (类型名)表达式 这个整体产生了一个
33、临时值。例:有如下代码:float a=3.8;int b;b=(int)a;这段代码把 a 强制转化为整型数据 3(注意 C 语言里的强制转换都是截取,而不是四舍五入) ,并把这个值 3 赋给整型变量 b。注意,此时 a 的值仍然是 3.8。强制转换只控制其后的一个数据例:(int ) a+b 和(int ) (a+b)不同:前者是把 a 强制转换为整型,再把这个临时的整型值和 b 作运算。后者是先计算 a+b,之后把它们的值做整体的强制转换。强制转换需要注意的几点:1) 类型名外的()必不可少2) 强制转换控制其后的一个数据3) 强制类型转换并不会改变右边表达式的值第六节 赋值表达式知识点
34、:赋值表达式的运算;复合赋值表达式的运算;自加和自减;重要程度:1、赋值运算符和赋值表达式步骤: 计算过程: 说明:第一步: 1.6+1*1.2-3/2.0 根据运算优先级和结合的顺序,先算 3/2,注意到它们为整型数据相运算,因此结果应为整数 1,而不是 1.5。第二步: 1.6+1.0*1.2-3.0/2.0 1*1.2 为整型和实型数据相运算,因此,会把整型数据 1 转换为对应的实型数据 1.0,再与 1.2 进行运算。同理,3 变成 3.0第三步: 1.6+1.2-1.5 分别计算出 1.0*1.2 和 3.0/2.0 的结果第四步: 2.8-1.5 同一优先级的运算,从左到右依次进行
35、第五步: 1.3 结果为 1.3,而不是 1.9http:/ a = 12;它的含义是将赋值运算符右边的表达式的运算结果赋值给左边的变量。说明:1)赋值运算符左边必须是单个变量。例如 x+1=3 在数学上虽然是正确的,可是在 C 语言中却是错误的,不能将一个常量赋值给一个表达式。2)赋值运算会将左边变量的值用右边表达式的值来代替,右边的值不会改变。例如,int x=3,y=5;x=y+1;以上代码先将 x 初始化为 3,将 y 初始化为 5。执行完赋值语句 x=y+1;后,变量 x 的值被 y+1 覆盖掉,即 x 的值变成了 6,变量 y 的值不会改变。用盒子理论来说就是,先定义了两个盒子,分
36、别叫做 x 盒子和 y 盒子,x 盒子装的是整数 3,y盒子装的是整数 5。之后把 x 盒子所装的内容改成 y 盒子的内容加 1,也就是 6。这样,x 盒子中装的就是 6 了,以后再要使用 x,都是用的新值 6。而以前 x 装过什么值现在再也不知道了。 3)赋值表达式的值是赋值号左边变量被赋值后的值。例如:x=0 整个赋值表达式的值是变量 x 被赋值之后的值,也就是说这个表达式的值为 0。4)可以将赋值表达式的值再赋值给变量,形成连续赋值运算。 (学会分析过程)例如,x=(y=25)是一个连续赋值表达式。由于赋值表达式的结合形式是从右到左,因此可以简写为 x=y=25,它表达的含义是将 25
37、赋值给变量 y,然后将表达式 y=25 的值赋值,即变量 y 的值赋给变量 x,结果使变量 x 和 y 的值都变为 25。5)虽然可以连续赋值,但是不能连续初始化。 (考试重点)例如:int x=y=25; 就是错误的。对于 int x=y=25;我们会先计算 y=25,此时,y 并没有定义,而是在直接使用,所以就会报错。如果我们把上面的连续初始化改成:int y; int x=y=25; 这样就没有错了。6)赋值运算符不同于数学上的“等号” 。 (C 语言中“=”表示赋值, “= =”表示等号)因为赋值运算符的操作是将赋值号右边的表达式的值赋给左边的变量。它是单方向的操作。例如在数学中,i=
38、i+1 不成立,但在赋值表达式中却是成立的,它表示将变量 i 的值增加 1 之后得到的结果赋值给变量 i,因此,该表达式的含义是使变量 i 的值增加 1。7)如果赋值号两边的运算对象类型不一致,则系统会自动进行类型转换。8)自动类型转换的实例:int a=3.6;赋值号左边的变量类型是整数,右边的值是实数,因此将右边的值转换成整数。3.6 转换成整数后是 3,因此 a 的值被赋为了 3。注意:实数转换成整数的方法是截取而不是四舍五入,因此直接把小数点后的数据去掉就行了。2、复合赋值表达式(掌握如何计算即可)在 C 语言中,可以将算术运算符与赋值运算符组合在一起组成复合赋值运算符。它们是:+=
39、,-=,*=,/= ,其使用方法及具体的运算规则如下:表达式 n+=100 等价的表达式为:n=n+100新视野教育国家计算机二级考前冲刺资料-12表达式 n-=2*n 等价的表达式为:n=n-2*n表达式 n*=m+1 等价的表达式为:n=n*(m+1)表达式 n/=m+1 等价的表达式为: n=n/(m+1)上述四种复合赋值运算符的运算优先级与赋值运算符的优先级相同(优先级都非常低) ,运算方向均为自右向左。想一想:n+=10 和 n+10 有什么区别?区别在于前者 n 本身的值改变了,而后者 n 的值没有改变。例 1: 已知变量 n 的初始值为 8,计算表达式 n+=n*=n-2 的值。
40、 (经典考题)分析:表达式中有两个复合赋值运算符:+=和*=。它们优先级相同,运算方向均为自右向左。因此,运算的步骤如下:(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;请问
41、:c 的值最终是多少?错误的算法: c=c*a+b;得到的是 16。正确的算法: c=c*(a+b);得到的是 22。第七节 自加表达式1、自加与自减运算符(超级重点)如何让一个变量自身的值加 1?通过之前的学习,我们知道 a=a+1; 和 a+=1; 都可以实现。而我们将要讨论的 a+和+a 同样可以实现这样的效果。自加、自减运算是一种赋值运算。既然 a+和+a 写法上有区别,那么它们应该有所不同。这里仅就 +运算符进行说明,-运算符有类似的结论:a+和+a 的相同处:对于变量 a 而言,它们都是让 a 的值加 1。a+和+a 的不同处:( +a)、(a+)是两个自加表达式,所以这两个表达式
42、本身就有数值,只是+a,a+两个的表达式的数值不同。自加表达式的核心理解 遇到 a+,就看成 a,等这部分执行结束后,再让 a 的值加一。 (加号在后,则先使用后自加) 遇到+a,则把 a 的值先加一,之后再使用加过一后的值。 (加号在前,则先自加后使用) 。例如有以下代码(通过以下代码,学会分析 a+和+a 的执行过程):int a=3,b;b=a+;这段代码执行完后,b 的值为 3,a 的值为 4。+a 是先把 a 加 1,再作为(+a)这个表达式的数值。a+是先把 a 的数值作为(a+)这个表达式的数值,再使 a 自加 1。http:/ b=a+; 按照以上所说,我们就看成 b=a; 此
43、时 a 值为 3,因此赋值后 b 的值也为 3。等这部分执行结束后,再让 a 的值加一。因此,整个这段代码结束后, b 的值为 3,a 的值为 4。-int a=3, b;b=+a,代码发生了变化,那么执行完后,a 和 b 的值分别为多少呢?对于语句 b= +a; 按照以上所说,我们把 a 值先加一,得到 a 的值为 4。之后赋值给 b。因此,整个这段代码结束后,a、b 的值都为 4。说明:补充考点:1)增量运算符的运算对象只能为单个变量,不能是常量或是表达式。例如:+3、+ (i+1)都是不合法的增量表达式。2)不论“+ ”在变量的前面还是在变量的后面,对于变量本身都具有 “增加 1”的相同
44、效果。例如 i+、+i 两个增量表达式运算后变量 i 的值都是增加 1。3)自加、自减运算符的结合方向是“从右到左” 。例如有如下代码:int y,x=3; y=-x+; 负号“- ”与自加运算符 “+”具有相同的运算优先级,但是根据“从右到左”的结合方向,那么应该先计算 x+,而 x+可以先看成就是 x。取其负值 3 赋给 y,那么 y 的值就为-3,这部分执行结束了,x 的值再加一,所以这段代码结束后,x 的值为 4,y 的值为-3。4)在使用“+”运算符时,变量应该有个确定的值。例如: int a; a+; 就是错误的。因为刚定义好的 a 值不确定。让一个垃圾值自加一没有任何意义。经典考
45、题:例 1: 有以下定义语句:double a,b; int w; long c;若各变量已正确赋值,则下列选项中正确的表达式是A)a=a+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 错误。通过以上的简单例子,我们看到,a+ 和+a 都会让 a 本身的值加一。不同在于对别人的影响。语句 b=a+; 等价于以下两条语句:b=a;a+ ;(先使用(赋值) ,后自加)语句 b=+a; 等价于以下两条