《C语言程序设计基础》课件第2章_第1页
《C语言程序设计基础》课件第2章_第2页
《C语言程序设计基础》课件第2章_第3页
《C语言程序设计基础》课件第2章_第4页
《C语言程序设计基础》课件第2章_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章C语言中的基本数据与运算——C语言基本元素2.1常量2.2变量2.3数据类型与存储结构2.4算术表达式实训任务三

熟悉数据类型,掌握常量、变量的正确使用实训任务四

熟悉C语言中算术表达式的书写与求值

C语言的基本元素有哪些?

从一般的语言体系来讲,一种语言最基本的内容是语言元素。C语言的基本元素是构成C程序语句的基本成分。从C程序的功能来讲,一个C语言程序就是对一个问题的特定数据进行存储、加工处理,并将结果输送给用户,因此程序最基本的内容应是基本数据与运算。

C语言的基本元素包括基本字符集、数据、表达式和函数。

(1) C语言的基本字符集是ASCII码表中的一些基本字符。在C语句中对使用的字符一般都有具体的规定,这里不再专门介绍。

(2)数据。C语言中的数据是C语句的组成部分,又是C程序加工处理的对象。数据对象各种各样,在C语言中划分为不同的数据类型。一种数据类型代表了一种数据对象的逻辑结构,而且定义了它的存储结构。C语言允许使用的数据类型如图2.1所示。类型名称后括号内的字符是定义该类型数据的关键字。

图2.1C语言中允许使用的数据类型

C语言中的数据按其在程序中的表现形态又可分为常量和变量。

(3)表达式。表达式既是C语句的组成部分,又是C程序中对数据进行运算的主要方式。表达式有算术表达式、关系表达式、逻辑表达式等。

(4)函数。函数可以出现在C语句中,是语句的构成部分,但函数又是C程序的功能模块,贯穿于C语言程序设计的始终,这将在后续章节中介绍。

从上述内容可知,C语言的基本元素包含的内容也较广泛,有些内容需要具备一定的C语言知识才能够理解。本章先从尽快进入C语言程序设计学习的角度,只介绍最基本的数据类型和算术表达式,其他内容将在后续章节介绍。

2.1常

何谓常量?常量有哪些类型?常量在程序中如何表示?

常量是在程序中以数学中常数的形式出现的数据。常量在程序运行过程中其值始终保持不变,这是相对于变量而言的。其实,常量就是常数数据。不同类型的常量在程序中的书写形式是不同的。

2.1.1整型常量

整型常量用数学中的整数形式书写,如10、105、2386、-1、-20、-15678等。在C语言中,整型常量除采用十进制数外,还可以采用八进制和十六进制数表示。八进制数和十六进制数实际上是二进制数的缩写。

八进制整数:以0开头,作为八进制数的标识,后跟八进制基本数字0~7。如0123表示八进制数123,即十进制数83;-011表示八进制数-11,即十进制数-9。

十六进制整数:以0x开头,作为十六进制数的标识,后跟十六进制基本数字0~9,A,B,C,D,E,F。如0x12F表示十六进制数12F,即十进制数303;-0x1B表示十六进制数-1B,即十进制数-27。2.1.2实型常量

1.小数形式

小数形式实数是以数学中的小数形式书写,如0.01、123.456、-5.78、1.0、12.0等。注意:如果一个实数没有小数位,必须在数的末尾加小数点,或将小数点后的小数部分写为“0”;否则,就按整数处理。例如,12.和12.0都是正确的实数。

2.指数形式

指数形式的实数与数学中的指数形式不同,用字母“e”或“E”表示数学指数中的底数“10”,指数不能写成上标形式,而应与所有字符平等书写,“e”或“E”之前必须有数字,“e”或“E”后面必须为整数。例如,12.34e3代表12.34×103,-346.87e-25(代表-346.87×10-25,0.145E25代表0.145×1025。e4和12e2.5是错误的写法,因为e4的e前无数字,12e2.5的e后面是小数。

指数形式的实数与数学中的写法不同,因此务必注意,一定要从学习C语言之初就养成习惯。2.1.3字符常量

1.普通字符

普通字符以单撇号界定,如'a'、'A'、'3'、'0'、'?'、'#' 都表示字符常量。字符常量必须是单个字符,如 'ab'、'12' 就不是字符常量了。

注意:数字作为字符常量就不代表数字值了,它的值是ASCII码。例如 '3' 的值是48(见附录A)。

2.转义字符

C程序中还允许使用一种特殊形式的字符常量,即转义字符,它是单撇号界定的以“\”开头的字符序列。例如,前面在printf函数中已用过的 '\n',它代表一个“换行符”。'\t' 代表将输出位置跳到下一个tab位置(制表位置),一个tab位置是向后跳8个字符位的位置。这是一种在屏幕上无法显示的“控制字符”,在程序中也无法用一般形式的字符来表示,只能采用这样的特殊形式来表示。常用的以“\”开头的特殊字符见表2.1。表2.1转义字符及其作用2.1.4字符串常量

字符串常量是一个字符序列作为一个数据对象。它是用双撇号界定的一个字符序列。例如,"boy"、"123" 是两个字符串常量。注意不要把字符串界定符双撇号写成单撇号。如'boy',这样的写法既不表示字符串常量,也不表示字符常量。2.1.5符号常量

在C程序中,可以将一个常量定义成一个符号,用符号来表示所定义的常量。这样,可以给程序设计带来很大便利。一般在程序的开头,用预处理指令进行定义。其一般形式如下:

#define符号常量数据

例如:

#definePI3.1415926

在程序中,在定义后的的任意地方,都可以用PI来表示3.1425926。PI就是符号常量。在程序设计中,如果一个常量比较冗长,或一个常量要在多处书写,将该常量定义成符号常量,会带来极大便利。一方面,可避免冗长数据书写容易出错的问题;另一方面,如果一个常量在程序中多处出现,要改变此数据必须多处修改,定义成符号常量后,只要在定义处修改即可。在定义符号常量时,标识符采用“顾名思义”的习惯,为与变量有所区分,常将字母大写。例如,要定义商品价格常量符号,可用“PRICE”作为符号名。

2.2变

2.2.1变量的内涵

一个变量就代表一个数据的存储单元。可以把一个存储单元比作存放一个数据的盒子,如图2.2所示。盒子中存放了数据,这个数据可以多次取出来使用,也可以将一个新数据存放在盒子中,但新数据存入时,旧数据就自然丢掉了。盒子里面的内容(数)是变量的值。存储单元随时可存入新数,在程序运行过程中,一个变量的值随时可发生变化,正是从这个意义上称之为变量的。

图2.2存储单元示意图

2.2.2变量的定义

程序中使用的变量必须先定义,后使用。只有定义了的变量,程序编译时,系统才会给其分配相应的存储单元。变量定义的一般形式为

类型符

变量名;

其中,类型符可以是图2.1中基本类型中的各种数据类型后标注的关键字,例如,整型用int,字符型用char,单精度浮点型用float,双精度浮点型用double。类型关键字规定了变量的类型,也就是变量值的类型。从数据存储的角度来讲,不同类型的数据,系统给其分配不同长度的存储单元。例如,系统给char型数据分配一个字节的存储单元,给int型数据分配4个字节的存储单元。只有定义了类型,系统才能给变量分配相应长度的存储单元。

变量名是变量所表示的数据对象的名称。从存储器的特性来说,每一个存储单元都有一个编号,称之为地址,对存储单元中数据的存取,必须要给出单元地址。因高级程序设计语言中不涉及硬件特性,所以通过变量名来使用变量的值。从原理上讲,变量名就代表存储单元地址。了解这一原理概念,对理解变量的操作是非常有用的。也就是说,变量名是存放数据的存储单元的标识符。

C语言规定标识符只能由字母、数字和下划线三种字符组成,且首字符必须是字母或下划线。下面列出的是合法的标识符,也是合法的变量名:

Sum,average,_total,student_name,lotus_1_2_3下面列出的是不合法的标识符和变量名:

M.D.John,¥123,#33,3D64,a>b

在C语言标识符中,大写字母与小写字母被认为是两个不同的字符。因此,Sum和sum,class和Class是两个不同的标识符。一般地,变量名用小写字母表示,这已成为C语言中约定俗成的变量命名方法。

在选择变量名和其他标识符时,应养成“顾名思义”的习惯,即选有含义的英文单词(或其缩写)作标识符。如sum表示和数,average表示平均值,total表示总数。这样可提高程序的可读性。从以上变量定义语句可以看出,一个定义语句可以定义一个变量,也可以定义多个变量,但在一个语句中定义的多个变量必须是同类型的,变量之间要用逗号分隔。

例2.1

整型变量的定义与使用。

2.3数据类型与存储结构

2.3.1整型数据的存储结构

整型数据在存储器中用补码的形式存储。C语言标准中没有具体规定各种类型数据所占存储单元的长度,但在各种编译系统中都有自己的规定。整型数据常见的存储长度与值的范围,在表2.2中列出。

表2.2整型数据常见的存储长度和值的范围整型数为什么要区为分带符号数和无符号数呢?在实际应用中,有些数只取正值,如学号、年龄、存款额等,为了充分利用变量值的取值范围,可定义为无符号型。因为有符号数据,存储的最高位表示符号位。定义成无符号数,就不需要符号位。这样,在同样的存储长度下,无符号类型数就是有符号类型数的2倍,即扩大了无符号类型的数值范围。无符号类型关键字是在带符号类型关键字前加上unsigned。不加unsigned的类型,都为带符号整型。2.3.2字符型数据的存储结构

字符型数据在存储器中存储的是字符的ASCII代码,一个字符型数据只占一个字节,数值范围为0~255,若取值范围超出0~255,则出错。

2.3.3实型(浮点型)数据的存储结构

实型数据是以指数形式存放在存储单元中的。一个实数表示为指数,可以有不止一种形式,如3.1416可以表示为3.14159×100,0.314159×101,0.0314159×102,31.4159×10-1等。显然,小数点位置在浮动,同时指数的值也在改变。由于小数点位置可以浮动,所以把实数的指数形式称为浮点型。一个实数在程序中的指数表示形式可有多种,但它在计算机内部的存储形式及程序的输出结果中都只有一种规范化的指数形式。把小数部分中小数点前的数字为0、小数点后的第1位数字不为0的指数表示形式称为规范化的指数形式,如0.314159×101就是实数3.14159的规范化指数形式。

实数在存储时,系统把小数和指数两个部分分别存放,如图2.3所示。图中是以十进制数来示意的。实际上,计算机是用二进制数表示小数部分,用2的幂次的二进制数表示指数部分。小数部分和指数部分各占多少位,C标准中并无规定,是由各编译系统自行规定的。小数部分的位数决定了实数表示的精度,位数越多,数的有效位数越多,精度也就越高。指数部分的位数越多,则数值的取值范围就越大。图2.3指数存储示意图常见的3种类型实数的存储长度、有效数字和取值范围如表2.3所示。TurboC对longdouble型分配16个字节的存储长度。VisualC++6.0对longdouble型分配8个字节的存储长度。

表2.3实型数据的存储长度、有效数字和取值范围 2.4算术表达式

2.4.1基本算术运算符与表达式

1.基本算术运算符

C语言中的基本算术运算符见表2.4。

表2.4基本算术运算符

2.运算符的优先级与结合性

C语言规定了运算符的优先级和结合性。在表达式求值时,先按运算符的优先级高低次序进行。5个基本算术运算符的优先级是先*、/、%,后+、-。如a-b*c,b的左侧是减号,右侧是乘号,因乘号优先于减号,所以,相当于a-(b*c)。如果一个运算对象两侧的运算符的优先级相同,如a-b+c,则按规定的结合方向处理。C语言规定了运算符的结合方向(结合性)。基本算术运算符的结合方向为“自左至右”,又称为“左结合性”,即运算对象先与左侧的运算符结合。因此,b先与减号结合,进行a-b运算,再执行加c运算。关于“结合性”的概念在其他一些高级语言中是没有的,是C语言的特点之一,需认真加以理解。

3.混合运算的数值类型转换

如果一个表达式中包含了不同数据类型的运算对象,在进行运算时,不同类型的数据先要转换成同一类型,然后进行运算。转换的规则是:把存储长度短的类型向存储长度长的类型转换。各种数据类型间的一般转换顺序可表示如下:

(short,char)→int→unsigned→long→float→double

算术运算符是双目运算符,一个运算符涉及两个运算对象,一次转换只在两种不同类型间进行。例如int型与double型数据进行运算,先将int型数据转换成double型,然后进行运算,结果是double型。假设已定义i为int型变量,f为float型变量,d为double型变量,l为long型变量,分析下面表达式的运算:

10+'a'+i*f-d/e

计算机执行时从左至右扫描,运算次序为:

(1)进行10+ 'a' 的运算,先将 'a' 转换成整数97,运算结果为107。

(2)由于“*”比“+”优先,先进行i*f的运算,将i转换成float型,运算结果为float型。

(3)整数107与i*f的积相加。先将整数107转换成实数(小数点后加若干个0,即107.000…00),结果为float型。

(4)将变量e化成double型,d/e的结果为double型。

(5)将10+'a'+i*f的结果与d/e的商相减,结果为double型。

上述表达式运算过程中的类型转换是由系统自动进行的。在某些情况下,需要在程序中设置操作数类型的转换,这样的转换方式称为强制转换。如%运算要求两运算数必须是整型数,如果在程序中遇到一个或两个运算数不是整型数,就需要强制转换。

强制类型转换的一般形式为

(类型符)(表达式)

需要说明的是,在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。例如:

(int)x

如果已定义x为float型,进行强制类型转换后得到一个int型的中间变量,它的值等于x的整数部分,而x的类型不变,仍为float型。

分析:从程序的运行结果可以看出,x强制转换为int型并赋给变量i,输出i的值,即整型,x仍为float型,保持原值不变。

从上述内容可知,有两种类型转换:一种是在运算时不必由用户指定,系统自动进行的类型转换;另一种是强制类型转换。当自动类型转换不能达到目的时,可以用强制类型转换。如x为float型,则“x%3”不合法,必须用“(int)x%3”。2.4.2自加、自减运算符与表达式

1.自加、自减运算符与表达式

自加运算符(++)和自减运算符(--)都是单目运算符,只作用于单个变量,使变量的值加1或减1。它们各有两种使用方式:一种是变量在运算符前,另一种是变量在运算符后。

例如:

i++表示先引用i的值,再使i的值加1(i=i+1)。

++i表示先使i的值加1(i=i+1),再引用i的值。

i--表示先引用i的值,再使i的值减1(i=i-1)。

--i表示先使i的值减1(i=i-1),再引用i的值。

以上表达式的求值,可通过下列程序验证。

分析:程序中4个表达式求值都是在变量i的初值为3的基础上进行的。执行“a1=i++;”时,先把变量i的值3赋给变量a1,再使变量i的值加1,变量i的值变为4。执行“a2=++i;”时,先使变量i的值加1,变为4,再赋给变量a2,变量i和a2的值都为4。执行“s1=i--;”时,先把变量i的值3赋给变量s1,再使变量i的值减1,变为2。执行“a2=--i;”时,先使变量i的值减1,变为2,再赋给变量s2,变量i和s2的值都为2。

特别强调:自增运算符(++)和自减运算符(--)只能用于变量,而不能用于常量或表达式,如5++或(a+b)++都是不合法的。因为加1或减1后的值仍要存放在原变量中,常量和表达式是不能存储值的。

2.++和--的结合性

++和--的结合方向是“自右至左”,也称为“右结合性”。如果有-i++,i的左面是负号运算符,右面是自加运算符。如果i的原值等于3,若按左结合性,相当于(-i)++,而(-i)++是不合法的,因为对表达式不能进行自加、自减运算。从附录C可知,负号运算符和“++”、“--”运算符同优先级,而结合方向为“自右至左”(右结合性),即它相当于-(i++)。++和--的结合性可通过下例程序来验证。

分析:先使用i的值3,输出-i的值-3,然后i增值为4。表达式-i++的结合性为-(i++),执行时,先用i的值3取负号,将-3赋给a1,再对i加1,i的值变为4。表达式-++i的结合性为-(++i),执行时,先将i的值3加1后取负号,再将-4赋给a2。

3.自加、自减运算符表达式使用中需注意的问题

C运算符和表达式使用灵活,利用这一点可以巧妙地处理许多在其他语言中难以处理的问题,但使用中也有一些需要注意的问题:

(1)注意不同系统对表达式的求值顺序的差异,避免求值奇异。例如,i的初值为3,有以下表达式:

(i++)+(i++)+(i++)表达式的值是多少呢?有的系统按照自左而右顺序求解括号内的运算,求完笫1个括号的值后,实现i自加,i值变为4,再求第2个括号的值,结果表达式相当于3+4+5,即12。而另一些系统(如TurboC和VisualC++6.0)把3作为表达式中所有i的值,因此3个i相加,得到表达式的值为9,在求出整个表达式的值后再实现自加3次,i的值变为6。应该避免出现这种歧义性。如果编程者的原意是想得到12,可以写成下列语句:

i=3;

a=i++;

b=i++;

c=i++;

d=a+b+c;执行完上述语句后,d的值为12,i的值为6。虽然语句多了,但不会引起奇异,无论程序移植到哪一种C编译系统运行,结果都一样。

(2)注意运算符的组合。C语言中有的运算符为一个符号,有的运算符由两个符号组成,如果有多个运算符连写在一个表达式中,怎样组合运算符呢?如i+++j,是理解为(i++)+j,还是理解为i+(++j)呢?C编译系统在处理时,尽可能多地自左而右,将若干个字符组成一个运算符(在处理标识符、关键字时也按同一原则处理)。i+++j被理解为(i++)+j而不是i+(++j)。为避免误解,最好采取便于理解的写法,不要写成i+++j的形式,而应写成(i++)+j的形式。

(3)注意不同系统在调用函数时实参数的求值顺序的差异,避免求值奇异。C标准对函数参数的求值顺序并无统一规定。例如,i的初值为3,如果有下面的函数调用语句:

printf("%d,%d",i,i++);

在有的系统中,从左至右求值,输出“3,3”。在有些系统中,对函数参数的求值顺序则是自右而左,上面printf函数中要输出两个表达式的值,先输出第2个表达式i的值3,然后执行i++,使i加1变为4,因此输出的是“4,3”。为了避免这种求值的奇异,最好改写成函数参数求值与处理顺序无关的形式。如将上面的语句改为

j=i++;

printf("%d,%d",j,i);

由于编译系统的处理方法不同而引起的差异问题,并不是C语言标准,不必死记,必要时上机测试一下即可。但遇到问题时,应知道问题可能出在哪里。

2.4.3赋值运算符与表达式

1.基本的赋值运算符与表达式

“=”就是赋值运算符。用赋值运算符构成表达式的一般形式为

变量=表达式

这里的“=”不是表示数量相等的关系,而是表示一种“赋值”操作。其作用就是把右侧表达式的值赋给左侧的变量。也就是说,表达式的运算结果使变量具有赋值号右侧表达式的值。从变量的内涵意义来讲,就是把右侧表达式的值存放到变量所标识的存储单元中。将赋值表达式作为表达式的一种,使赋值操作也可以出现在赋值语句中,而且还可以出现在其他语句中。这是C语言灵活性的一种表现。赋值运算符的结合方向为“自右至左”,又称为“右结合性”。如a=b=c=5等价于a=(b=(c=5)),操作次序为:5赋给c,c的值赋给b,b的值赋给a。

例如:

a=5+(c=6)的处理步骤是c=6→5+c→a=5+c,表达式的值为11,变量a的值是11,变量c的值是6。

a=(b=4)+(c=6)的处理步骤是c=6→b=4→b+c→a=b+c,表达式的值为10,变量a的值是10,变量b的值是4,变量c的值是6。

a=(b=10)/(c=2)的处理步骤是c=2→b=10→b/c→a=b/c,表达式的值为5,变量a的值是5,变量b的值是10,变量c的值是2。

程序中的表达式在程序运行时,由计算机自动处理。但在程序设计中,或程序调试中往往需要分析表达式的求值。复杂表达式的求值要根据运算符的优先级和结合性(见附录C)分析处理顺序。初学者最好通过上机运行一个简单程序来验证表达式的求值,帮助对复杂表达式求值的理解。

分析:在printf的最后一个输出项直接写表达式,输出结果就是该表达式的值。利用printf函数,可以输出变量、表达式的值。这里只要模仿使用就行了,关于输出格式描述符,将在后面章节介绍。

2.赋值过程中的类型转换

如果赋值运算符左侧变量与右侧表达式的类型不一致,在赋值时,系统自动进行类型转换。类型转换的一般规则是:把右侧表达式的值转换为左侧变量的类型再进行赋值操作。

(1)将浮点型数据(包括单、双精度)赋给整型变量时,舍弃浮点数的小数部分,只将整数值赋给变量。

VisualC++6.0输出float型与double型数据的有效数字都是6位,其他系统则未必。

(3)将一个double型数据赋给float型变量时,应先将双精度数转换成单精度数,即只截取其前面6~7位有效数字,存放到float型变量的存储单元中。应注意被赋值的双精度数的大小不超出float型变量的数值范围,否则将可能产生溢出。

将一个float型数据赋给double型变量时,数值不变,有效位数扩展到双精度型。

(4)字符型数据赋给整型变量时,将字符的ASCII代码赋给整型变量,不存在数据丢失问题。

(5)将一个存储长度长的整型数据赋给一个存储长度短的整型变量时,将按等长度截取低字节值存放到短变量存储单元中。

从存储结构看,353的二进制数为0000000101100001,将低字节01100001赋给字符变量c,其十进制数值为97,对应的是字符 'a' 的ASCII代码,高字节将截断丢失。

一般来说,将存储长度长的类型数据赋给存储长度短的类型变量,会发生数据截断丢失的问题,实际应用中要尽量避免。

3.复合赋值运算符与表达式

在赋值运算符“=”之前加上其他运算符,可以构成复合赋值运算符。凡是二目运算符,都可以与赋值运算符一起组合成复合赋值运算符。C语言中有10种复合赋值运算符,即+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=。其中,后5种是有关位运算的,将在后面章节学习。

使用复合赋值运算符,按照一般赋值表达式的形式,可构造出各种表达式。下面是使用复合赋值运算构造表达式的例子:

a+=3等价于

a=a+3

x*=y+8等价于

x=x*(y+8)

x%=3等价于x=x%3

赋值表达式中可以包含复合赋值运算符。例如下面的表达式是一个正确的赋值表达式:

a+=a-=a*a

如果a的初值为12,此赋值表达式的求解步骤如下:

(1)进行(a-=a*a)的运算,相当于a=a-a*a,a的值是12-144=-132;

(2)进行(a+=-132)的运算,相当于a=a+(-132),a的值为-132+(-132)=-264。

2.4.4逗号运算符与表达式

C语言中“,”也可以作为一种运算符,用它将两个以上表达式连接起来就构成了逗号表达式。逗号表达式的一般形式为

表达式1,表达式2,表达式3,…,表达式n

逗号运算符的作用是将若干表达式“串联”起来,确定这些表达式的求值顺序。逗号表达式的求值顺序是从左到右依次求表达式1,表达式2,…,最后求表达式n的值。逗号运算符在C语言的所有运算符中优先级最低,具有左结合性(见附录C)。事实上,它仅能确定被连接表达式的求值顺序。但它作为一个表达式,应该具有值。逗号表达式的值是最后一个表达式的值。下面列举几个逗号表达式,分析它们的求值。例如:

3+5,6+8

先求3+5的值,得8,再求6+8的值,得14,逗号表达式的值为14。

再如:

a=3*5,a*4

此表达式是算术表达式、赋值表达式和逗号表达式的混合。根据运算符的优先级和结合性,应该把a=3*5看作逗号表达式中的表达式1,把a*4看作逗号表达式中的表达式2。因此应先求a=3*5的值,经计算和赋值后得到a的值15,再求a*4的值,求解值为60。整个逗号表达式的值为60。又如:

x=(a=3,6*3)

x=a=3,6*3

这两个表达式是不同的表达式。前一个是赋值表达式,将一个逗号表达式的值赋给x,x的值等于18。后一个是逗号表达式,包括一个赋值表达式和一个算术表达式,x的值为3,整个逗号表达式的值为18。一个逗号表达式可以作为逗号表达式中的表达式,构成复合的逗号表达式。例如:

(a=3*5,a*4),a+5

把(a=3*5,a*4)作为逗号表达式的表达式1,a+5作为逗号表达式的表达式2。(a=3*5,a*4)又是一个逗号表达式,先处理a=3*5,得到a的值为3*5,等于15,再处理a*4,运算结果为15×4=60。处理a+5,得20。整个表达式的值为20。

逗号表达式的求值,尤其是复合逗号表达式的求值不容易理解。下面通过程序的运行来验证上述表达式的求值。

其实,逗号表达式无非是把若干个表达式“串联”起来。在许多情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到整个逗号表达式的值,逗号表达式最常用于循环语句(for语句)中,详见第5章。

需注意的是,逗号在逗号表达式中是运算符,但在C语言中也有不作为运算符使用的情况,要根据逗号出现的地方加以区分。如函数参数列表中用逗号来作为间隔符使用:

printf("%d,%d,%d",a,b,c);

其中的“a,b,c”并不是一个逗号表达式,而是作为3个输出项间的分隔符。这一点在前面printf函数的使用中应该有所体会。如果改写为

printf("%d",(a,b,c));

温馨提示

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

评论

0/150

提交评论