c语言程序设计第三章运算符和表达式Word格式文档下载.docx
《c语言程序设计第三章运算符和表达式Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《c语言程序设计第三章运算符和表达式Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
1.基本算术运算符
C语言为用户提供的基本算术运算符包括:
+(加)、-(减)、*(乘),/(除)、%(求余),这些运算符都是双目运算符,也即在生成算术表达式的时,基本算术运算符左右两侧都必须出现运算对象。
2.简单算术表达式
当用基本算术运算符去连接常量或者变量时,就形成简单算术表达式。
简单算术表达式的基本形式:
data1opdata2。
data1和data2表示某个常量或者变量,op代表上述5个基本算术运算符之一。
假设有变量定义:
inta=20,b=-5;
则a+b、a-b、a*-2、20/-b、20%6、a%b等都是简单算术表达式。
3.基本算术运算符使用说明
(1)+、-、*,/既可以连接整型数据,也可以连接实型数据。
当参与这4个运算符的运算对象都是整型数据时,得到整型数据运算结果;
否则表示浮点运算。
例如,inta=15,b=2;
则a*b等于30,而a/b等于7;
a*2.0等于30.0,而a/2.0等于7.5。
(2)在使用除法运算符时要注意右操作数(除数)不能为零。
(3)取余运算%只能对整型数据取余。
另外,由于取余实质上是先进行除法运算,然后得到相除后的余数,所以和除法运算符一样,右操作数不能为零。
例如,inta=15,b=0;
double
d=3.0;
则a%b和a%d都是非法的表达式。
【例3.1】调用函数printf打印表达式的值。
#include<
stdio.h>
main()
{
inta=15,b=20;
printf("
%d+%d=%d\n"
a,b,a+b);
15+20=%d\n"
15+20);
%d+5=%d\n"
a,a+5);
}
说明:
(1)printf不仅能打印单个常量或者单个变量的值,还能将任意的有值表达式的值打印在
控制台屏幕上。
(2)操作数和运算符之间可以有空白符,见本例程序中的“a+5”。
【例3.2】测试更多的算术运算符。
inti=7,j=2;
doubled=2.0;
%d%%%d=%d\n"
i,j,i%j);
j,i,j%i);
%d/%d=%d\n"
i,j,i/j);
%d/%f=%f\n"
i,d,i/d);
(1)%是格式说明符的起始字符,需要用%%来打印%,见本例程序第6行和第7行。
(2)从程序第8行和第9行的运行结果中不难看出,当两个整型数据参与除法运算时结果为整数,否则为浮点数。
4.字符的算术运算
第二章中提到过,由于字符在内存中是用ASCII码存储的,而ASCII码就是一个整数,所以字符数据和整型数据是兼容的,即可以把字符赋给整型变量,也可以把整数赋给字符变量,还可以用转换字符c或d输出字符数据和整型数据。
兼容性还体现在能让字符数据参与算术运算。
【例3.3】对字符进行算术运算。
charch1='
A'
ch2='
a'
;
inti=0x20;
printf("
%d,%d\n"
ch1+0x20,ch2-i);
%c,%c\n"
字符数据参与算术运算时,实际是用该字符的ASCII码值进行相应的计算。
二、自增(++)和自减运算(--)
++和--是两个单目的算术运算符,作用是使变量当前的值加1或减1。
当++或--放在变量名前面时,称为前自增或前自减运算;
当++或—放在变量名后面时,称为后自增或后自减运算。
以++为例,前自增运算是先对变量值加1运算,再使用变量的值(自增以后的值);
后自增运算是先使用变量原来的值,再对变量值加1。
【例3.4】比较前/后自增运算符的不同。
inta=2009,b=a;
a=%d,b=%d\n"
a,b);
a++=%d\n"
a++);
a=%d\n"
a);
++b=%d\n"
++b);
b=%d\n"
b);
(1)++和—主要用来改变变量的值,所以它们的操作数不能是数值。
例如,4++;
就是一条
非法语句。
(2)使用时只连接一个操作数的运算符为单目运算符(或叫一元运算符),所以sizeof和&
都是单目运算符。
sizeof可以计算某一类型数据存储时占据的内存字节数,例如sizeof(变量名);
&
用于获得变量的地址,例如,&
变量名。
【例3.5】分析以下程序的运行结果。
交换第5行与第6行后,程序的运行结果?
{
inta=2010;
%d\n"
--a);
a--);
通常,只在单一地对变量加1或减1的情况下才使用自增或自减运算符。
如果让自增/自减运算参与其他操作,有可能会出现意想不到的副作用。
【例3.6】自增/自减运算符的副作用。
inti=2010;
i=%d,i++=%d\n"
i,i++);
本例在VC6.0下运行的结果为:
i=2009,i++=2009;
而在TC2.0下运行的结果为:
i=2010,i++=2009。
三、算术运算符的优先级和结合性
本章开篇时提到过,可以将一个表达式嵌套在另一个表达式中,另一个等价的说法就是可以用运算符去连接表达式。
当用基本算术运算符连接常量或变量时可以形成最简单的算术表达式,而常量和变量本身就是最简单的有值表达式,所以事实上可以用基本算术运算符去连接两个有值表达式,即expression1opexpression2,这里的expression1和expression2表示有值表达式,而op则代表5个基本算术运算符。
例如,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所示。
结合性
右结合
左结合
根据结合性,在计算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】若有定义语句:
ints=6;
则表达式s%2+(s+1)%2的值为。
分析:
根据算符优先算法的基本思想,本例表达式中运算符的计算顺序如下:
s%2+(s+1)%2→0+(s+1)%2→0+7%2→0+1→1
【例3.8】算术运算符的优先级和结合性
inta=5,b=4;
a+b%%3*a+b%%2/4=%d\n"
a+b%3*a+b%2/4);
a++/--b=%d\n"
a++/--b);
++a*a++=%d\n"
++a*a++);
++a*10+15/b++=%d\n"
++a*10+15/b++);
3.3赋值运算符和赋值表达式
一、基本赋值运算符和赋值表达式的一般形式
1.基本赋值运算符
在第2章中,我们已经接触过对变量的赋值运算,它的作用是将数据存储在某个变量中(赋值运算实质上就是将数据写入到某个变量中)。
例如:
inti,j=-20,k;
i=j;
k=30;
当定义变量和对变量赋值在同一行进行时,称为对变量初始化。
2.赋值表达式的一般形式
我们既可以使用常量,也可以使用另一个变量的值对某个变量赋值,而常量和变量是最简单的有值表达式,所以赋值表达式的更一般的形式为:
变量=有值表达式。
(1)赋值运算符是双目运算符,出现在“=”左边的一定是个变量,右边的是一个有值表达
式,运算含义是将有值表达式的结果存入左边的变量中。
(2)赋值运算的结果是经过赋值以后“=”左边的变量值。
(3)我们已经学过的有值表达式包括:
常量、变量、算术表达式(包括自增、自减表达式)
和赋值表达式。
假设有如下变量定义:
inta=2,b=4,c,d;
则:
c=a+b、c=a++、d=--b、
d=c=a等都是赋值表达式。
(4)赋值运算符的优先级在C语言所有运算符中排倒数第二(仅高于逗号运算符)。
(5)赋值运算符的结合性是右结合。
【例3.9】基本赋值运算测试。