
c语言程序设计 第三章运算符和表达式.doc
17页第三章 运算符和表达式3.1 运算符和表达式概述使用运算符可以对运算对象(包括常量和变量)进行计算以得到计算结果用运算符将运算对象连接成一个符合C语言语法规则的式称为表达式另外,C语言中的表达式是可以嵌套的,即简单表达式经过运算符连接后还可以形成更为复杂的表达式根据运算符所连接的运算对象(操作数)的个数,可以将C语言中的运算符分为三类:(1) 单目(一元)运算符:只连接一个操作数的运算符2) 双目(二元)运算符:带有两个操作数的运算符3) 三目(三元)运算符:同时对三个操作数进行计算的运算符C语言中的表达式可以分为三类:(1) 单个常量或者单个变量是最简单的表达式2) 带有运算符的表达式3) 函数调用任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果所以运算对象、运算符和运算结果是运算的三大要素 3.2 算术运算符和算术表达式一、基本算术运算符和简单算术表达式1. 基本算术运算符C语言为用户提供的基本算术运算符包括:+(加)、-(减)、*(乘),/(除)、%(求余),这些运算符都是双目运算符,也即在生成算术表达式的时,基本算术运算符左右两侧都必须出现运算对象。
2. 简单算术表达式当用基本算术运算符去连接常量或者变量时,就形成简单算术表达式简单算术表达式的基本形式:data1 op data2data1和data2表示某个常量或者变量,op代表上述5个基本算术运算符之一假设有变量定义:int a=20,b=-5;则a+b、a-b、a*-2、20/-b、20%6、a%b等都是简单算术表达式3. 基本算术运算符使用说明(1) +、-、*,/既可以连接整型数据,也可以连接实型数据当参与这4个运算符的运算对象都是整型数据时,得到整型数据运算结果;否则表示浮点运算例如,int a=15,b=2;则a*b等于30,而a/b等于7;a*2.0等于30.0,而a/2.0等于7.52) 在使用除法运算符时要注意右操作数(除数)不能为零3) 取余运算%只能对整型数据取余另外,由于取余实质上是先进行除法运算,然后得到相除后的余数,所以和除法运算符一样,右操作数不能为零例如,int a=15,b=0;double d=3.0;则a%b和a%d都是非法的表达式例3.1】 调用函数printf打印表达式的值include
2) 操作数和运算符之间可以有空白符,见本例程序中的“a + 5”例3.2】 测试更多的算术运算符include
二、自增(++)和自减运算(- -)++和--是两个单目的算术运算符,作用是使变量当前的值加1或减1当++或--放在变量名前面时,称为前自增或前自减运算;当++或—放在变量名后面时,称为后自增或后自减运算以++为例,前自增运算是先对变量值加1运算,再使用变量的值(自增以后的值);后自增运算是先使用变量原来的值,再对变量值加1例3.4】 比较前/后自增运算符的不同include
例3.5】 分析以下程序的运行结果交换第5行与第6行后,程序的运行结果?#include
例如,a*b+2010(其中a、b为int变量)、3.5-2.0+d (d为double变量)1. 运算符的优先级当一个表达式中使用了多个运算符时,由运算符的优先级决定到底哪一运算先进行算术运算符的优先级如表3-1所示表3-1 算术运算符的优先级表运算符优先级++、--2*、/、%3+、-4所以在计算a*b+2010时,由于变量b左边的乘法运算符*的优先级高于右边的加法运算符+,所以该表达式应先执行乘法运算,后计算加法(将乘法运算的结果和常量2010相加)2. 运算符的结合性 那么对于表达式“3.5-2.0+d”怎么计算?因为变量d左右两边的运算符+和-的优先级是相同的由此可见,当某个常量或者变量左右两边的运算符的优先级相同的时,无法通过优先级来决定运算符执行的先后顺序,这时需要由结合性来判定运算顺序算术运算符的优先级和结合性如表3-2所示 运算符优先级结合性++、--2右结合*、/、%3左结合+、-4左结合根据结合性,在计算3.5+d-2.0时,由于加法运算符+和减法运算符是左结合,即变量d先和左边的加法运算相结合,所以该表达式应先执行加法运算,后计算减法(将加法运算的结果和常量2.0相减)。
若想不受优先级和结合性的制约,人为地改变运算的先后顺序,则可以使用括号例如,对于表达式“a*b+2010”,若想强制先执行加法运算,则需对加法子表达式使用括号——a*(b+2009),对于表达式“3.5+d-2.0”,若想强制先执行减法运算,则需对减法子表达式使用括号——3.5+(d-2.0)3. 复杂表达式的计算在计算复杂表达式时,常常可以应用算符优先算法的基本思想——先从左往右扫描整个表达式,一旦发现表达式中某个变量或者常量左边运算符的优先级高于右边运算符的优先级时,就执行左边运算然后对经过化简的表达式按照上述过程继续化简,直到所有运算执行完毕为止例3.7】 若有定义语句:int s=6;则表达式s%2+(s+1)%2的值为 分析:根据算符优先算法的基本思想,本例表达式中运算符的计算顺序如下:s%2+(s+1)%2 → 0+(s+1)%2 → 0+7%2 → 0+1 → 1【例3.8】 算术运算符的优先级和结合性#include
例如:int i,j=-20,k;i=j;k=30;当定义变量和对变量赋值在同一行进行时,称为对变量初始化2. 赋值表达式的一般形式我们既可以使用常量,也可以使用另一个变量的值对某个变量赋值,而常量和变量是最简单的有值表达式,所以赋值表达式的更一般的形式为:变量=有值表达式说明:(1) 赋值运算符是双目运算符,出现在“=”左边的一定是个变量,右边的是一个有值表达式,运算含义是将有值表达式的结果存入左边的变量中2) 赋值运算的结果是经过赋值以后“=”左边的变量值3) 我们已经学过的有值表达式包括:常量、变量、算术表达式(包括自增、自减表达式)和赋值表达式假设有如下变量定义:int a=2,b=4,c,d;则:c=a+b、c=a++、d=--b、d=c=a等都是赋值表达式4) 赋值运算符的优先级在C语言所有运算符中排倒数第二(仅高于逗号运算符)5) 赋值运算符的结合性是右结合。












