
2.7 表达式与求值原则
2.7.1 表达式的概念
用运算符和括号把常量、变量、函数等连接起来的式子叫作表达式。
在C语言中,使用不同的运算符就会形成不同的表达式,比如使用算术运算符就会形成算术表达式,使用关系运算符就会形成关系表达式等。但是,实际情况下往往是综合的,各种运算符都会出现。
2.7.2 算术表达式
使用算术运算符连接起来的式子就叫算术表达式,算术表达式在求值时,应该按照优先级和结合性取值,算术表达式的结合性是从左向右,所以运算数应先和左边的运算符结合,再和右边的运算符结合。
如果一个算术运算符两侧的数据类型不同,则系统会自动进行类型转换。
也可以使用类型转换符把一个数据转换成所需要的类型,例如:

2.7.3 关系表达式
用关系运算符把两个表达式连接起来的式子就是关系表达式。关系运算符两边的表达式可以是各种表达式,比如算术表达式、逻辑表达式、赋值表达式、关系表达式等。
例如:

(1)关系表达式的值是逻辑值“真”和“假”,在C语言中以“非0”和“0”表示。
(2)关系表达式的结合方向是“自左往右”,因此,这样的表达式是成立的:

(3)字符型数据在进行关系运算时是以其ASCII码值进行比较。例如:

'A'的ASCII码是65,65>100不成立,表达式的值为0。
(4)应避免对实数作相等或不等于0的判断。例如:

可改写为:

(5)注意区分“=”与“==”,例如:

2.7.4 逻辑表达式
用逻辑运算符把关系表达式或逻辑量连接起来的式子就称为逻辑表达式。逻辑表达式的值应该是一个逻辑值,而这个逻辑值的实质还是整型数值0和1。
一个逻辑表达式可以进行多个逻辑运算。在实际运算时,一般按优化的方法进行求值。对逻辑与运算(即&&运算),如果第一个操作数为0,可以确定其结果为0,不再进行第二操作数的运算,这种特性称为“短路特性”。
例如:

又比如:假设a=10,b=9,k=2,j=0,以下表达式的值计算次序为:

由于5>a为假,k=0,整个表达式的结果为假,为0。计算机就不再计算j=7<b,所以j的值仍然保持0值,而不是1。
当一个逻辑表达式中包含多个逻辑运算符时,按如下的优先次序运算:
!->&&->||(!优先级别最高,其次为&&,最后是||)
逻辑运算符中的&&和||运算优先级别低于关系运算符,而!不仅高于关系运算符,还高于算术运算符。它们有如下关系:
!->算术运算符->关系运算符->&&->||
由于有上述优先次序,因此:
(a>b)&&(x>y)可以写成:a>b&&x>y。
(a==b)||(x==y)可以写成:a==b||x==y。
(!a)||(a>b)可以写成!a||a>b。
在逻辑表达式中,真用“非0”表示,假用“0”表示。因此有如下结果:
例如

那么:

2.7.5 条件表达式
条件表达式是由C语言中的条件运算符“?:”构成的表达式。它是C语言里面唯一的一个三目运算符。
条件表达式的一般格式为:

例如:

条件运算符的优先级高于赋值运算符,例如:

应该先求出表达式(x!=y)?(s+t):(a-b)的值,然后再赋给K。
但是,条件运算符的优先级别低于关系运算符和算术运算符的优先级,因此,上式中的圆括号可以不要,可以写成:

条件运算符的结合方向是从右向左,如有多个条件运算符在一起时应特别注意它们的结合方向,例如:

应按下面的次序计算:
先计算(x<y?i:j),然后计算(x+y)<(s-t)?k:x<y?i:j。
2.7.6 赋值表达式
赋值表达式的一般形式为:
变量名=表达式
赋值表达式的求解就是把表达式的值赋给运算符左侧的变量,经过赋值运算之后,变量的值就是表达式的值。
赋值运算是按从右向左的方向进行结合的,因此应该“先计算后赋值”。同时赋值号右边的表达式本身也可以是一个赋值表达式,例如:

赋值表达式还可以包含复合运算符,例如:

在赋值时,系统会自动将赋值号右边的数据类型自动转换为赋值号左边的类型,例如:

得到的结果为整型,b由float类型自动降为int类型。
赋值时可以连续赋值,例如:
