表达式是由运算符(包括括号)、操作数(常量、变量、函数等,是一个操作符操作于其上的数)按照一定的规则组成的式子;可以将常量、变量和函数认为是最简单的表达式。表达式可以嵌套,每个表达式都有一个值。在计算时要考虑运算符的优先级、结合性及数据类型的转换;计算机中的表达式都写在一行中。表达式有算术、赋值、关系、逻辑、条件和逗号等。在表达式的后边加个分号就是表达式语句。除了控制语句外,几乎都是表达式语句。如:

算术表达式:用于算术计算; 赋值表达式:右值赋值给左值; 关系表达式:表达一些比较简单的关系; 逻辑表达式:表达一些比较复杂的关系,一般使用逻辑运算符来连接关系表达式; 条件表达式:"?:"表达式,if else语句的简单表达。

常见操作符及使用:

CC  语言4,表达式与运算符(1)

1 操作符的优先级、结合性

C语言的数据类型是指对数据按某种规则所进行的分类。运算符是说明特定操作的符号,是构造表达式的工具。

要理解由多个操作符组成的表达式,必须先理解操作符的优先级、结合性,理解操作数的求值顺序。

运算符的结合性与优先级:如自增自减、赋值运算符,是从右到左;算术运算符、关系运算符,是从左到右。

结合性规定了具有相同优先级的操作符如何分组。我们已经遇到过涉及结合性的例子。其中之一使用了赋值操作的右结合性,这个特性允许将多个赋值操作串接起来:

CC  语言4,表达式与运算符(2)

ival = jval = kval = lval // right associative,starting from right (ival = (jval = (kval = lval))) // equivalent, parenthesized version

该表达式首先将 lval 赋给 kval ,然后将 kval 的值赋给 jval ,最后将 jval 的值再赋给 ival。

另一方面,算术操作符为左结合。表达式

ival * jval / kval * lval // left associative (((ival * jval) / kval) * lval) // equivalent, parenthesized version

先对 ival 和 jval 做乘法操作,然后乘积除以 kval,最后再将其商与 lval 相乘。

一元操作符和含等号=(赋值操作)的运算符大都是右结合操作符,除此以外,都是左结合(从左至右)。

2 逻辑表达式的短路求值

int i=6; int j=1; if(i>0 || (j )>0) j =5;

j 的计算会被忽略,对于||,如果左边的条件表达式为真,右边的条件表达式不管是真还是假,整个表达式都是真,这也就是短路求值,只有在左边条件表达式不确定整个逻辑表达式的结果时,才会计算右边的条件表达式,这在一定程度上增加了效率,但也可能带来了一些无法预料的错误。当用||连接两个条件表达式时,适合将可能性小的表达式放在左边先计算。

if(i<0 && (j )>0) j =5;

j 的计算会被忽略,对于&&,如果一个为假,其他不管是真还是假,整个表达式是假,适合将可能性大的表达式放在左边先计算;

3 表达式中的自动类型转换

整型与整型数运算,结果为整型,如 5 / 2 = 2 整型与浮点数运算,结果为浮点数,如5 / 2.0 = 2.5 字符与整型数运算,结果为整型。 字符与浮点数运算,结果为浮点数。 浮点数与浮点数运算,结果为浮点数。

4 逻辑表达式

使用关系运算符不能够清晰地描述更为复杂的逻辑关系,因为一个复杂的逻辑通常会包含多个小的逻辑关系。

如果我们的逻辑更为复杂,有多个逻辑条件,则代码中需要多个嵌套的if语句。为了使用计算机语言简化逻辑关系的描述,计算机语言的专家们提出了逻辑运算符的概念。逻辑运算符主要是实现了人类语言中并且、或者等连词在计算机中的表示。使用逻辑运算符可以连接关系表达式以构成复杂的逻辑表达式。C 中共有3种逻辑运算符,分别为“&&”、“||”和“!”。其中“&&”表示逻辑与运算符,也就是“并且”的含义,当两个表达式同时为真,其结果为真,否则为假。“||”表示逻辑或运算符,即“或者”的含义,当两个表达式中有一个表达式为真,结果为真,否则为假。“!”表示逻辑或运算符,即当表达式的值为真,结果为假,当表达式的值为假,其结果为真。

构成逻辑表达式的运算符有关系运算符(&&、||、!)和逻辑运算符(>、>=、<、<=、==、!=等),单独的关系运算符构成的关系表达式是简单的逻辑表达式,逻辑运算符用于连接关系表达式,可以构成复杂的逻辑表达式。C语言逻辑运算的结果是:真与假(1与0)。

5 空语句

表达式以分号“;“结尾,单独的一个分号可以构成一条空语句:

while((*pdst =*psrc )!='\0') ;

当在一个控制结构的条件或逻辑表达式中完成了所需要的操作时,可以使用空语句(同时,控制结构也要求有语句体)。

空语句要避免以下错误;

while((*pdst =*psrc )!='\0'); //不小心加的分号 {//以下块语句的执行并不是按上述的条件表达式的判断来执行的,而是顺序执行一次 //…… }

6 逗号表达式

逗号表达式是一组由逗号分隔的表达式,逗号表达式从左向右计算。逗号表达式的结果是其最右边表达式的值。如果最右边的操作数是左值,则逗号表达式的值也是左值。此类表达式通常用于for循环,用于初始或更新多个用于条件判断的变量。

逗号表达式,从左往右计算,结果是最右边表达式的值,如:

y=(x=2,x =8,x 12),x x;

结果是:x=10, y = 20

7 表达式计算的内部实现

根据运算符在表达式中的位置,一般有三种表示方法:中序法(我们日常一般的写法),前序法,后序法(运算符在操作数和前面)。对于中序法因为运算符的优先级问题,计算机在处理上较为复杂,所以一般会将中序法转化为前序或后序法。后序法只需要一个堆栈缓存器(前序法需要两个)。

转换的方式有:括号转换法(先用括号把中序法表达式的运算符优先级分出来,再进行运算符的移动。)、堆栈法;

-End-