2024年6月14日发(作者:)

龙源期刊网

C语言中的表达式与表达式的值

作者:刘玉利

来源:《电脑知识与技术·学术交流》2008年第23期

摘要:结合最小表达式的概念详细论述了表达式的值的求解方法,并通过几个典型实例剖

析了C语言表达式的值的具体应用及分析方法。

关键词:C语言;运算符;表达式

中图分类号:TP312文献标识码:A文章编号:1009-3044(2008)23-965-01

Expression and Its Value of C Language

LIU Yu-li

(Electron Department,Engineering College,Linyi Normal University,Linyi 276000,China)

Abstract: This paper discussed detailedly the way of evaluation of expression with the concept of

minimum expression,and analysed the concrete application and analytic method of evaluation of

expression.

Key words: C language; operator; expression

1 引言

C语言是基于结构化程序设计思想的程序设计语言,结构化的程序由函数组成,而函数是

由语句组成的。C语言中语句的标志是分号,对于一个语句而言,去掉分号后,它只是一个式

子,这个式子就是表达式。

2 表达式

表达式是构成语句的基本单位,C语言中的表达式是由运算符串联起来的式子,所串联的

对象可以是常量、变量或函数调用。表达式的划分是由运算符来决定的,由算术运算符串联起

来的式子称为算术表达式;由关系运算符串联起来的式子称为关系表达式等。很多情况下需要

龙源期刊网

讨论有且只有一个运算符的表达式,因此把这种有且只有一个运算符所构成的表达式称为最小

表达式,如a+b或!a等就是最小表达式。任何复杂的的表达式都是由最小表达式构成的,如:

a+b>c+d,这是一个关系表达式,而关系运算符的两边又是有算术表达式a+b和c+d组成,这

两个算术表达式都是最小表达式。最小表达式是求值的基本单位,因此在最小表达式两边加上

括号而不影响整个表达式的值,如a+b>c+d和(a+b)>(c+d)的结果是一样的。

对于一个复杂的表达式而言,划分最小表达式的依据是各种运算符的优先级和结合性,首

先以表达式中优先级最高的运算符为核心划分出一级最小表达式,然后加上小括号运算符,小

括号里面的最小表达式使用它的值进行替换,因此形成一个新的表达式,然后这个新的表达式

的基础上寻找二级最小表达式,直到将原表达式分成只有一个运算符的表达式为止,根据最后

的这个运算符就能确定原表达式的类型,因此就能确定原表达式的值及其类型。

3 表达式的值

表达式的值是表达式运算后的结果,任何一个表达式都会有一个值及其类型,这个值是一

个常量,也就是说任何一个最小表达式的值都是一个某种类型的常量,算术表达式的的值是整

形或浮点型的常量,关系表达式或逻辑表达式的值是逻辑量0或1。如1+2是一个算术表达

式,它的结果3是一个整形常量,而1+2+5这个算术表达式可以通过寻找最小表达式的的方式

将其改成(1+2)+5,在运算(1+2)+5这个表达式时,小括号部分是一个最小表达式,需要使用该

最小表达式的值(常量)和5进行运算,即3+5,对于这个新的表达式而言,它只有一个运算

符,是一个最小表达式,我们可以根据这个最小表达式确定原表达式是一个算术表达式,它最

终的结果就是一个整数常量(8)。

在分析一个表达式的时候需要将一个复杂的表达式分解成若干个最小表达式,结合表达式

的值这一概念,分析表达式最终的值时可以利用表达式的值一步一步完成原表达式的求值过

程。例如求10+'a'+i*f的结果,我们从最小表达式的角度分析整个表达式的运算过程。

先寻找一级表达式,*优先级最高,则可将原表达式改成10+'a'+(3*2.0),根据类型转换相

关的知识可知,运算3*2.0时,由于2.0是double型常量,需要将3转换成double型的常量

3.0(不再显示小数点后其它多余的0,下同),运算的结果是double型的常量6.0,因此原表达

式可以转变成10+'a'+6.0,而表达式'a'的值在做算术运算时用它的ASCII码97,因此可以写成

10+97+6.0,这个表达式的运算符都是算术运算符,而算术运算符的结合性是自左向右的,因

此它等于(10+97)+6.0,也就是107+6.0,这时原表达式就变成一个最小表达式,由于6.0是

double型的常量,同样需要将107转换成double型的107.0,然后再和6.0运算,所得到的结

果是113.0,类型是一个double型的常量。

龙源期刊网

这种分析过程和C语言编译器求解过程可能不同,但最终结果都是一样的,而这种分析方

法可以使初学者更容易的接受复杂表达式的求解过程。

当单个的常量、变量出现在赋值符号的右边是可以看作是表达式的特例,如int

a,i=3;a=i;其中3是一个常量表达式,而在a=i这个表达式中i可以看成一个最小表达式的特

例,赋值过程是将表达式i的值(整形常量3)赋给变量a。

“=”本身也是一个运算符,它所串联的式子是一个赋值表达式,该表达式的值采用赋值运

算符右边的表达式的值,如a=3是一个赋值表达式,该表达式的值是采用右边常量表达式3的

值,作为该表达式的值,因此不难理解b=a=3的赋值过程。由于赋值运算符是右结合的因此可

以将原表达式通过最小表达式的方式求解,即b=(a=3),小括号中是一个最小赋值表达式,该

表达式的值是3,即原表达式变成b=(3)。

函数调用也是一种最小表达式,在运算时用函数的返回值作为该表达式的值,如如

i=Max(a,b),该赋值运算符在运算时是将Max(a,b)的返回值(某种类型的常量)赋给i。

4 特例

自增(自减)表达式是一个特例。++a本身是一个最小表达式,该表达式的值采用变量a

中的值,而不是用最小表达式的值,如(++a)*(++a),假设a=1,如果用最小表达式的概念来分

析,前一个小括号中是一个最小自增表达式,该表达式的值是2,后一个小括号也是一个最小

自增表达式,该表达式的值是3,理论上分析最终的结果应该是2*3=6,而在TC2.0和VC6.0

下显示的结果是9,也就是说原表达式所使用的是变量a中的值,经过两次自增后a中的值是

3,因此结果是3*3=9。

5 结束语

C语言中的表达式与表达式的值这两个概念非常重要,对于初学者而言,如何求解复杂表

达式的值是他们的难点,从教学过程中发现一旦他们真正理解了最小表达式的概念后,这个问

题就迎刃而解了。

参考文献:

龙源期刊网

[1] 谭浩强.C程序设计[M].3版.北京:清华大学出版社,2005.

[2] 何钦铭,颜晖.C语言程序设计[M].杭州:浙江科技出版社,2004.

[3] 黄维通,马力妮.C语言程序设计[M].北京:清华大学出版社,2003.