C语言程序设计运算符及表达式_第1页
C语言程序设计运算符及表达式_第2页
C语言程序设计运算符及表达式_第3页
C语言程序设计运算符及表达式_第4页
C语言程序设计运算符及表达式_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

会计学1C语言程序设计运算符及表达式3.1表达式 C语言的表达式分为基本表达式和复杂表达式。 基本表达式是由以下单项构成的,即:标识符、常量、字符串字面量和用圆括号括起来的表达式。 将基本表达式通过运算符连接在一起,就构成复杂表达式。例如:2+8,a+b,(x-y)/a等。 由表达式还可组成更大的表达式。例如:

x=(a+b)%10第1页/共60页3.2运算符及表达式

运算符是在一个数学运算中表示相应运算动作的一种符号。 运算符所作用的对象称作运算分量。第2页/共60页3.2.1算术运算符和算术表达式 在C语言中,基本算术运算符有5个,它们是: +(加)-(减)*(乘)/(除)%(取模)

算术运算符和运算分量组成的求值序列称作算术表达式。 要注意运算符“/”和“%”的区别。 运算符“/”可以作用于算术类型。 运算符“%”却只能作用于整型量。

a/b表示两个整数进行整除,其结果是舍弃余数后所得到的商值。 是取整数除法的余数,而不管商的值是多少。第3页/共60页例3-1:算术运算符应用示例。/*arithmeticpractice*/#include<stdio.h>voidmain(){inta=99;

intb=5;

intc=11;

intd=3;

intresult;

result=a-b;第4页/共60页printf("a-b=%d\n",result);

result=b*c;

printf("b*c=%d\n",result);

result=a/b;

printf("a/b=%d\n",result);

result=a%b;

printf("a%%b=%d\n",result);

result=a%d+b/c;

printf("a%%d+b/c=%d\n",result);}第5页/共60页输出结果是:a-b=94b*c=55a/b=19a%b=4a%d+b/c=0第6页/共60页例3-2:计算有多个算术运算符的算术表达式。#include<stdio.h>voidmain(){intx,a=3;

floaty;

x=20+25/5*2;

printf("(1)x=%d\n",x);

x=25/2*2;

printf("(2)x=%d\n",x);

x=-a+4*5-6;第7页/共60页printf("(3)x=%d\n",x);

x=a+4%5-6;

printf("(4)x=%d\n",x);

x=-3*4%-6/5;

printf("(5)x=%d\n",x);

x=(7+6)%5/2;

printf("(6)x=%d\n",x);

y=25.0/2.0*2.0;

printf("(7)y=%f\n",y);}第8页/共60页输出结果是:(1)x=30(2)x=24(3)x=11(4)x=1(5)x=0(6)x=1(7)y=25.000000第9页/共60页3.2.2赋值运算符和赋值表达式 赋值运算符“=”,其简单的使用形式是: 变量=表达式 这种形式的整个表达式称作赋值表达式。在使用赋值表达式时应注意以下几点: ①在赋值运算符左边的量(通常称为左值)必须是变量,不能是常量或用上述运算符结合起来的表达式。

inta,b;

a=b;b=8; 是正确的赋值形式;

6=a;a+b=14; 等形式都是不对的。第10页/共60页 ②赋值运算可连续进行。例如,

a=b=c=0 a=(b=(c=0)) ③赋值运算符的优先级比上述运算符的优先级都低。

a=(b=9)*(c=7) ④赋值表达式的值等于右边表达式的值,而结果的类型由左边变量的类型决定。第11页/共60页 ⑤除了上述基本的赋值运算符之外,C语言中还提供了另外10个赋值运算符,它们是: +=-=*=/=%=>>=<<=&=|=^= 这些运算符是把“运算”和“赋值”两个动作结合在一起,往往把它们称为复合赋值运算符。

x+=2其等效形式是:x=x+2。表达式x*=y+5的等效形式是:x=x*(y+5)。而表达式x%=y-10的等效形式是:x=x%(y-10)

复合赋值运算符右边的表达式应作为一个整体对待。第12页/共60页 3.2.3增量运算符和增量表达式 自增运算符“++”和自减运算符“――”。它们都是单目运算符。当出现在运算分量的前面时,例如++i、――i,就称之为前缀运算符;当出现在运算分量的后面时,例如x++、y――,就称之为后缀运算符。由增量运算符和运算分量构成的表达式称为增量表达式。

1.自增运算符 ++n

这个表达式执行后,n的值增1。 还可采用“后缀加”的形式:

n++ 但必须指出,并非在任何情况下二者都等价。第13页/共60页例3-3:显示前缀加和后缀加的区别。#include<stdio.h>voidmain(){inta,b,c;

a=9;

b=++a;第14页/共60页printf("(1)a=%d***b=%d\n",a,b);

a=9;

c=a++;

printf("(2)a=%d***c=%d\n",a,c);}运行后输出的结果是:(1)a=10***b=10(2)a=10***c=9第15页/共60页

执行b=++a,这条语句等价于下述两条语句:

c=a+1;

b=a; 而改为后缀加形式,即:c=a++,这条语句等价于下述两条语句:

c=a;

a=a+1; 简而言之,在表达式中出现前缀加的情况下,前缀加所作用的运算分量值先增1,然后进行其他级别较低的运算;而在表达式中出现后缀加的情况下,先以其运算分量的当前值参与其他级别较低的运算,最后该运算分量值才增1。第16页/共60页

例3-4:复合赋值符和自增运算符“++”的应用。

Voidmain(){intx=2,y,z;

x*=3+2;

printf("(1)x=%d\n",x);

x*=y=z=4;

printf("(2)x=%d\n",x);

x=y=1;

z=x++-1;第17页/共60页printf("(3)x=%d***z=%d\n",x,z);

z=x++*++y;

printf("(4)x=%d***y=%d***z=%d\n",x,y,z);

}输出结果是:(1)x=10

(2)x=40

(3)x=2***z=0

(4)x=3***y=2***z=4第18页/共60页2.自减运算符“――n”就等价于:

n=n-1它也分前缀减和后缀减两种形式。m=--n;等价于:n=n-1;

m=n;而m=n--;却等价于:m=n;

n=n-1;第19页/共60页

在使用增量运算符时,还应注意以下几点: ①增量运算符有副作用。就是说,增量运算符作用于运算分量时,如“++a”,不仅可以向外提供一个值,而且还改变运算分量自身的值。例如:

x=++i+i

或者x=i+(++i) ②“++”和“――”是单个运算符,不是通常意义上的两个“加”号或者两个“减”号。第20页/共60页 ③x=i+++j; 是理解成(i++)+j,还是i+(++j)呢?C语言词法分析遵循“最长匹配”原则,即:如果在两个运算分量之间连续出现多个表示运算符的字符(中间没有空格),那么,在保证有意义的条件下,就从左到右尽可能多地将若干个字符组成一个运算符。所以,表达式就解释为(i++)+j,而不是i+(++j)。建议读者在录入程序时,在各个运算符之间加入空格,或者使用圆括号,把有关部分括起来,使之作为整体处理。第21页/共60页 ④“++”和“――”只能作用在变量上,如“a++”,“――n”等,而不能用于常量和一般表达式(不是左值的表达式)。 另外,增量运算符与运算分量结合在一起构成的表达式带有自身赋值含义,但这种表达式不是左值,不能直接出现在赋值号左边。第22页/共60页3.2.4关系运算符和关系表达式

C语言有完整的一组关系运算符,用于比较两个运算分量间的大小关系。这组运算符有6个,即: >>=<<===!= 用关系运算符将两个运算分量连在一起构成的表达式称作关系表达式。根据运算符所作用的两个运算分量之间的指定关系是否成立,分别得到关系表达式的“真”、“假”结果。第23页/共60页

在C语言中,没有表示“真”、“假”的逻辑量TRUE(真)和FALSE(假),就借用数值来表示。以数值0表示“假”,以非0值表示“真”。对于关系表达式来说,结果的真、假分别用1和0表示。 关系运算只判定两个运算分量是否满足指定的关系,而不理睬二者具体数值相差多少。 应注意,赋值号“=”与全等比较运算符“==”的区别。 关系运算符的优先级低于算术运算符。

a+b<c+d

应理解为:(a+b)<(c+d)

前4个关系运算符的优先级相同,后两个相等比较运算符的优先级也相同。但前者的优先级恰好比后者高一级。第24页/共60页例3-4:分析下面程序的运算结果。1voidmain()2{3inta,b,c;4a=b=c=10;5a=b==c;6printf("a=%d,b=%d,c=%d\n",a,b,c);7a==(b=c++*2);8printf("a=%d,b=%d,c=%d\n",a,b,c);9a=b>c>=100;10printf("a=%d,b=%d,c=%d\n",a,b,c);11}第25页/共60页上述程序运行之后的输出结果是:a=1,b=10,c=10a=1,b=20,c=11a=0,b=20,c=11第26页/共60页3.2.5条件运算符和条件表达式

C语言中提供的条件运算符“?:”是惟一的三目运算符。 由条件运算符组成的表达式简称为条件表达式,或三目表达式。其一般构成形式是: 表达式1?表达式2:表达式3

决定条件表达式值的方法是:先计算表达式1的值;若该值不为0,则计算表达式2的值,并将表达式2的值作为整个条件表达式的值;否则,就计算表达式3的值,并将该值作为整个条件表达式的值。第27页/共60页

例如,要求出x和y中最大的一个,并赋予变量max。

max=(x>y)?x:y; 使用条件运算符时,还要注意以下几点: ①条件运算符的优先级稍高于赋值运算符,但比其他运算符的优先级都低。 ②三个运算分量不限于简单的算术表达式,甚至可以是函数调用。 ③分析条件表达式时,关键是先找出“?”和“:”,把三个运算分量区分开,然后按一般方法进行计算。第28页/共60页例3-5:分析下面程序运行的结果。1voidmain()2{3inta,b,c;4a=b=c=1;5a+=b;6b+=c;7c+=a;8printf("(1)%d\n",a>b?a:b);9printf("(2)%d\n",a>c?a--:c++);10(a>=b>=c)?printf("AA"):printf("CC");11printf("\na=%d,b=%d,c=%d\n",a,b,c);12}第29页/共60页3.2.6逗号运算符和逗号表达式 在C语言中,逗号的用途主要有两种:一是作为分隔符,二是作为运算符。 (1)逗号分隔符 用来分开相应的多个数据。

inta,b,c;

printf("A=%d\tB=%d\n",a,b);第30页/共60页

(2)逗号运算符 逗号作为运算符时,是把两个运算分量“连接”起来,使之构成一个逗号表达式。 逗号表达式的一般形式是: 表达式1,表达式2

它的执行过程是:先计算表达式1,然后计算表达式2。整个逗号表达式的值是表达式2的值。 逗号表达式的扩展形式是: 表达式1,表达式2,…表达式n

各个表达式必须从左到右顺序执行,而整个逗号表达式的值是其中最右边表达式的值。

x=(i=10,j=5,i*j)

逗号运算符在所有运算符中是级别最低的。第31页/共60页3.2.7逻辑运算符和逻辑表达式

C语言中逻辑运算符有3个,它们是: !逻辑非(相当于其他语言中的NOT) &&逻辑与(相当于其他语言中的AND) ||逻辑或(相当于其他语言中的OR)

其中,“!”是单目运算符,而&&和||是双目运算符。第32页/共60页第33页/共60页

由逻辑运算符和运算分量构成的表达式称为逻辑表达式。 (1)逻辑非运算符! 作用在单个运算分量上,其结果是运算分量逻辑值的“反”。 (2)逻辑与运算符&&

作用在前后两个运算分量上,其结果是:仅当两个运算分量同时为真时,结果才为真;否则,只要其中有一个为假,结果就为假。

第34页/共60页

(3)逻辑或运算符||

作用在前后两个运算分量上,其结果是:只要其中有一个运算分量为真,结果就为真;仅当二者同时为假时,结果才为假。 这三个逻辑运算符的优先级是:!的优先级高于&&的优先级,&&的优先级又高于||的优先级。第35页/共60页

例3-7:判断给定的某一年是否是闰年。 什么是闰年呢?如果某年号能被4整除而不能被100整除,或者能被400整除,那么这年就是闰年;否则就是平年。 下面的程序对用户输入的年号判别是否是闰年。1/*determingifayearisaleapyear*/2#include<stdio.h>3第36页/共60页4Voidmain()5{6intyear,leap;7printf("Inputyouryear.\n");8scanf("%d",&year);9leap=year%4==0&&year%100!=0||year%400==0;10if(leap)11printf("%disaleapyear.\n",year);12else13printf("%disnotaleapyear.\n",year);14}第37页/共60页

在使用逻辑运算符时应注意以下几点: ①用逻辑运算符把运算分量连接起来就构成逻辑表达式。其运算分量可以是关系表达式、算术表达式等,甚至还可以是逻辑表达式。 ②!的优先级高于算术运算符的优先级。 运算符!的结合性是从右到左,而&&和||的结合性是从左到右。 ③逻辑表达式的值只有两个:0和1。以0代表逻辑结果为假;以1代表逻辑结果为真。第38页/共60页 ④运算符&&和||保证左边的运算分量优先得到计算。就是说,由&&和||构成的逻辑表达式严格地从左到右进行计算,并且一旦根据左分量的值就能确定整个逻辑表达式的值时,就不再执行后面的运算。 例如,

x=y=z=1; ++x||++y&&++z; 执行之后,x、y和z的值分别是2,1,1。第39页/共60页3.2.8位逻辑运算符和位逻辑表达式

1.二进制 只用0和1两个数字来表示所有的数。二进制数的基本规则是“逢二进一”。

2.八进制和十六进制 八进制数是以8为基底的数,用到的数字是0,1,2,…,7,一共8个。它的基本进位规则是“逢八进一”。 八进制整常数是以数字0开头的八进制数字串。 二进制数与八进制数之间很容易进行转换。对于一个二进制数来说,从右向左每三个数字为一组分开,把每组二进制数转为八进制数表示。第40页/共60页

将八进制数转换成二进制数时,只要将每位八进制数字用三位二进制数表示,串起来就是相应的二进制数。 十六进制数是以十六为基底的数,它由数字0,1,2,…,9和字母A,B,C,D,E,F(或者a,b,c,d,e,f)来表示。其基本进位规则是“逢十六进一”。 在C语言中,十六进制整常数是以0x或0X开头的十六进制数字串,例如0x12、0X5a8。 二进制与十六进制的转换也很容易:对于一个二进制数来说,从右向左每四个数字为一组,把每组二进制数用十六进制数字表示。把十六进制数的每一位数字用四位二进制数表示,串起来就是相应的二进制数。第41页/共60页 3.原码、反码和补码 在计算机内表示数值的方法是不同的,一般有:原码、反码和补码。 (1)原码 通常,整数用一个字长表示。一般用最左边的一位(称作最高位)表示数的符号:以0代表正,1代表负。 二进制数的原码表示形式是:最高位用于符号位,其余各位是数值的绝对值。第42页/共60页

(2)反码 正数的反码与原码相同。负数的反码是:原码除符号位外(仍为1),各位取反。 (3)补码 正数的补码与原码相同。除最高位仍为1外,原码的其余各位求反,最后再加1第43页/共60页4.位逻辑运算符和位逻辑表达式在C语言中,位逻辑运算符有以下4个:&(按位与)|(按位或)~(按位反)^(按位异或)

它们都是按二进制一位一位地进行运算,相邻位之间不发生联系,即没有“进位”、“借位”等问题,所以称为位逻辑运算符。第44页/共60页

各个位逻辑运算符的优先级关系是:~最高,其余3个运算符的优先级从高到低依次是&、^、|,但三者都高于逻辑运算符而低于关系运算符。 由位逻辑运算符和运算分量构成的表达式称作位逻辑表达式。 位逻辑运算符与逻辑运算符之间的区别: ①位逻辑运算符是针对二进制位的,而逻辑运算符是针对整个表达式的;位逻辑运算符要计算表达式的具体数值,而逻辑运算符只判别表达式的真与假。 ②位逻辑运算符&、|和^的两个运算分量是可交换的;而逻辑运算符&&和||的两个运算分量都是不可交换的,并且它们严格从左到右运算。第45页/共60页3.2.9移位运算符和移位表达式

C语言中实现移位功能的运算符有两个:<<(左移)和>>(右移)。它们都是双目运算符,并且要求两个运算分量都是整型量。由移位运算符和运算分量构成的表达式称作移位表达式。 (1)左移运算符<< 它的一般使用形式是: 表达式1<<表达式2

它的功能是:把表达式1的值(以二进制形式表示)向左移动n位,n值由表达式2确定,并且表达式2的值必须是正整数。第46页/共60页

例如,a=00001011,那么,移位表达式

a<<3

的结果是01011000,即:把a的各二进位全部向左移3位,右边空出的位补0,而左边溢出的位被丢弃不管。第47页/共60页

(2)右移运算符>> 它的一般使用形式是: 表达式1>>表达式2

它的功能是:把表达式1的值(以二进制形式表示)向右移n位,n的值由表达式2确定(该值必须是正整数) 例如,a=00001011,那么,移位表达式

a>>3

的结果是00000001,即:把a的各二进位全都向右移3位,右边溢出的位被丢弃,而左边空出的位(在本例情况下)补0。 在右移时,要注意符号位问题。第48页/共60页3.2.10其他运算符 (1)&和* 单目运算符&用来取出其运算分量的地址,例如,

inta,*p;

p=&a; “*”也是单目运算符,它是“&”的逆运算。它把运算分量(应是指针量)所指向的内存单元中的内容取出来。例如,

b=*p;第49页/共60页

(2)强制类型运算符()

一般使用形式是:

(类型名)表达式 它把表达式的类型强制转换成圆括号中“类型名”所指定的类型。

(double)a

这是类型的临时转换方法。 (3)sizeof

单目运算符sizeof用来计算某种类型的变量或某种数据类型在计算机内部表示时所占用的字节数。例如:

sizeof(int)第50页/共60页

(4)单目加“+”和单目减“-”运算符 单目加“+”运算的结果仍是其运算分量的值 负号(―)的运算结果是其运算分量的负值 (5)基本运算符

[]()->·

其中,[]用于数组下标的表示,()用于标识函数,“->”和“”用于存取结构或联合中的成员。它们的优先级在所有运算符中是最高的。第51页/共60页3.3运算符优先级和结合性第52页/共60页

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论