《C语言程序设计》课件2第3章_第1页
《C语言程序设计》课件2第3章_第2页
《C语言程序设计》课件2第3章_第3页
《C语言程序设计》课件2第3章_第4页
《C语言程序设计》课件2第3章_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

第3章数据运算3.1算术运算3.2自增(减)运算3.3关系运算3.4逻辑运算3.5赋值运算3.6逗号运算3.7条件运算3.8位运算3.9测试数据长度运算习题3

本章学习要求:

1.掌握C语言各种运算符的使用与优先级。

2.掌握表达式的概念、运算符的优先级与结合性。

3.不同运算符(算术、自增和自减运算符、关系、逻辑运算符等)的使用特点,清楚每种运算符的优先级与结合性。

4.了解测试数据长度运算sizeof()。

运算符是告诉编译程序执行特定算术或逻辑等操作的符号。

C语言提供了很丰富的运算符,主要有以下几类:

(1)算术运算符。

(2)自增(减)运算符。

(3)关系运算符。

(4)逻辑运算符。

(5)赋值运算符。

(6)逗号运算符。

(7)条件运算符。

(8)位运算符。

(9)测试数据长度运算符sizeof。

另外,C语言还提供了一些用于完成特殊操作的运算符。

由运算符和操作数所组成的式子,称为表达式。只需一个操作数的运算符称为单目运算符,需要两个操作数的运算符称为双目运算符。操作数可以是常量、变量、函数和子表达式,每个表达式都有唯一确切的值,求解表达式时要注意运算符的优先级及结合性。在下面各节内容中,将详细讲解各运算符及其运算表达式。

算术运算是两个运算对象(也称操作数)之间的运算。表3.1列出了C语言允许的算术运算符。

在C语言中,运算符+、-、*

/

的用法与大多数计算机语言是相同的。它们几乎用于C语言中所有的数据类型。3.1算术运算

表3.1算术运算符说明:

(1)当“/”被用于整型或字符型数据时,结果取整。例如:在整数除法中,10/3

=

3。

(2)因为取余运算是取整数除法的余数,所以%不能用于除整型之外的其他类型的数据,要求%两侧均为整型数据,如7%3

=

1。

(3)用算术运算符和括号将运算对象连接起来。符合C语法规则的式子,称为C算术表达式。运算对象包括常量、变量、函数等。例如a

+

b/c*d,就是一个合法的C算术表达式。

(4)

C语言规定了运算符的优先级和结合性。在表达式求值时,先按照运算符的优先级别高低次序执行,例如先乘除后加减;如果一个运算对象两侧的运算符的优先级别相同,例如b/c*d,则按规定的结合方向处理。C语言规定,算术运算符的结合方向为

“自左至右”,即“左结合性”。

自增(减)运算是对一个运算对象施行的一种特殊的算术运算,即对一个运算对象进行算术运算之后,运算结果仍赋予该运算对象。因此,参加自增(减)运算的运算对象必须是变量。表3.2列出了C语言的自增(减)运算符。3.2自增(减)运算

表3.2自增(减)运算符说明:

(1)参加自增(减)运算的运算对象必须是整型变量。2++或(a+3)--都是不合法的。

(2)自增和自减运算符可用在运算对象之前(称为前置运算),也可放在其后(称为后置运算)。例如:

a

=

a

+

1;可以写成a++;或++a;

a

=

a

-1;可以写成a--;或--a;

(3)当自增或自减运算符与运算对象变量组成的运算表达式单独组成一条语句时,无论是前置运算,还是后置运算,其结果是一样的,即都是使该变量的值增加1或减少1。例如:

inta=1;

a++;

即执行后变量a的值为2。

如果写成:

inta=1;

++a;

则执行后变量a的值仍为2。

(4)当自增或自减运算符与其他运算符混合使用时,前置和后置用法是有区别的。

前置运算:自增或自减运算符在变量之前,C语言先执行对该变量的加1或减1操作,然后引用变量的数值作为整个自增或自减表达式的值。后置运算:自增或自减运算符在变量之后,C语言先引用变量的数值作为整个自增或自减表达式的值,然后执行对该变量的加1或减1操作。例如:

inta=1;

printf(“%d”,a++);

即执行后变量a的值为2,输出为1。

如果写成:

inta=1;

printf(“%d”,++a);

则执行后变量a的值仍为2,输出为2。

可以看出,无论是前置运算还是后置运算,对自增或自减运算的对象变量而言,都要执行一次自增或自减运算,效果是一致的。所不同的是,自增或自减运算表达式的取值是变量自增(减)之前的值,还是变量自增(减)之后的值。

(5)

++和--的结合方向是“自右至左”。

在大多数C编译程序中,为自增和自减运算符生成的程序代码比为等价的赋值语句生成的代码运算速度要快得多,因此尽可能采用++或--运算符是一种比较好的程序设计做法。

关系运算是对两个运算对象进行大小关系的比较。表3.3列出了C语言提供的关系运算符。3.3关系运算

表3.3关系运算符说明:

(1)前四种关系运算符(>,<,>=,<=)的优先级别相同,后两种(==和!=)也相同。前四种运算符的优先级别高于后两种。如“>”与“<”优先级相同,比“==”优先级高。

例如:a==b>c等价于a==(b>c)。

(2)关系运算符的优先级低于算术运算符。例如:a>b+c等价于a>(b+c)。

(3)关系运算符及相应操作数组成的式子称为关系表达式,其中操作数可以是常量、变量及子表达式(可以是算术表达式或关系表达式、逻辑表达式、赋值表达式等)。

例如,以下都是合法的关系表达式:

a>b,a+b>c-d,(a=1)>2,'a'=='b',(a>b)>c

(4)关系表达式的值是一个逻辑值,即true(真)或false(假)。在C语言中,关系表达式的值在取得true时为1,在取得false时为0。

例如:当a=1,b=2时,表达式a>b的值为0;表达式a<b的值为1。

又如:a=3,b=2,c=1,求解表达式a==b>c时,按照优先级高低,先计算b>c,得到结果为1,再计算a==1,得到最终结果为0。

(5)在等优先级的情况下,关系运算的结合性是“自左至右”。

例如,表达式a>b>c的求值应自左至右进行,即等价于(a>b)>c。当a=3,b=2,c=1时,表达式的最终计算结果为0。

用逻辑运算符将关系表达式或逻辑量连接起来就是逻辑表达式。表3.4列出了C语言的逻辑运算符。表3.5为逻辑运算的“真值表”,表示当a和b的值为不同组合时,各种逻辑运算的结果。3.4逻辑运算

表3.4逻辑运算符表3.5逻辑运算真值表说明:

(1)三个逻辑运算符中,“!”的优先级高于算术运算符,而“&&”和“||”的优先级低于关系运算符。例如:

(a>b)&&(c<d) 等价于a>b&&c<d

(!a)||(a>b) 等价于!a||a>b

(2)

C语言编译系统在给出逻辑运算结果时,用1代表“真”,用0代表“假”。但在判断运算对象是“真”是“假”时,用非0代表“真”,用0代表“假”。

例如,若a=2,b=1,c=0,则:

!a的值为0。

因为a的值为非0值,

被认为是“真”,进行“非”运算后,得到“假”,而运算结果“假”用0表示。

a&&b的值为1。因为a和b均为非0值,都被认为是“真”,因此a&&b的值也为“真”,用1表示。

a||c的值为1。因为a为非0值,被认为是“真”,c为0值,被认为是“假”,因此a||c的值为“真”,用1表示。

再如:2&&!4||'f'的值为1。参加逻辑运算的运算对象不仅可以是0和1,或者是0和非0的数值,也可以是任何类型的数据,如字符型、实型或指针型等。这里,字符'f'的ASCII码不为0,被认为是“真”。

(3)在逻辑表达式的求解中,并非所有的逻辑运算符都能被执行到。

a&&b&&c :只有a为真(非0)时,才需要判别b的值;只有a和b都为真时,才需要判别c的值。如果a为假,则不判别b和c的值,整个表达式的值为假;如果a为真,b为假,则不判别c,见图3.1。

a||b||c:只要a为真(非0)时,就不必判别b和c的值,整个表达式的值为真;只有a为假时,才需要判别b的值;只有a和b都为假时,才需要判别c的值,见图3.2。

图3.1a&&b&&c

图3.2a||b||c

③例如下面程序:

main()

{ inta=1,b=0,c=0;

if(!(--a&&(b+=a)&&++c))printf("%d,%d,%d

\n",a,b,c);

}

输出结果如下:

0,0,0

C语言中,除了有最基本的赋值运算符“=”外,还有复合赋值运算符。

1.赋值运算符

C语言使用单个的“=”符号作为赋值运算符。

赋值运算的一般形式为

变量

=

表达式

3.5赋值运算它的作用是将赋值运算符“=”右边的表达式的值赋给赋值运算符“=”左边的变量。其中,表达式可以是简单的一个常量或变量,也可以是复杂的常量、变量及运算符的组合。

说明:

(1)当赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换,主要有以下几种情况:

①将实型数据(单、双精度)赋给整型变量时,舍弃实数的小数部分。如a为整型变量,执行“a=2.5”的结果是使a的值为2。

②将整型数据赋给实型变量(单、双精度)时,数值不变,但以浮点数形式存储到变量中。如将3赋给float变量f,即执行“f=3”,则先将3转换为3.00000,再存储在f中。如将3赋给double变量d,即执行“d=3”,则先将3补足有效位数字为3.00000000000000,

然后以双精度类型存储到d中。

(2)赋值运算符的优先级比关系运算符和逻辑运算符的优先级别低,见图3.3。

2.复合赋值运算符

在赋值运算符“=”之前加上其他运算符,就构成了复合赋值运算符。一般的二元(二目)运算符,都可以与赋值运算符一起组合成复合赋值运算符。C语言规定,可以使用10种复合赋值运算符,即+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。前5种是算术运算符和赋值运算符结合形成的算术赋值运算符,后5种是有关位操作的,将在3.8节介绍。

算术赋值运算符如表3.6所示。

表3.6算术赋值运算符说明:

(1)参加算术赋值运算的两个运算对象,先进行算术运算,然后将运算结果赋给第一个运算对象。因此,这组运算符要求第一个运算对象必须是变量。

(2)由于复合赋值运算符是赋值运算符中的一类,因此其优先级别比其他运算符低。

例如:

a+=b-1 等价于 a=a+(b-1)

3.赋值表达式

由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。

(1)对赋值表达式求解的过程是:将赋值运算符右边的表达式的值赋给赋值运算符左边的变量。赋值表达式的值就是被赋值的变量的值。

例如,赋值表达式

“a

=

1”的值为1,变量a的值也为1。

又如,复合赋值表达式a

+

=3的值为变量a在原值上加3以后的值。再如,if((c=getchar())=='')m=1;其中c=getchar()是一个赋值表达式,表达式的值是被赋值的变量c的值,即从键盘读入的一个字符。整条语句的作用是:如果从键盘读到空格,则将变量m赋值为1。

(2)赋值运算符是右结合性,即在C语言的一个表达式中,当出现多个连续的赋值运算符时,运算顺序是从右向左。例如:a=b=c=0 等价于a=(b=(c=0)),变量a、b、c的值均为0,表达式的值为0。

下面是赋值表达式的例子:

a

=

1

-(b

=

0) 表达式的值为1,a值为1,b值为0。

a

=

(b

=

1)

+

(c

=

2)表达式的值为3,a值为3,b值为1,c值为2。

(3)赋值表达式也可以是复合赋值运算。例如:

a+=a-=a*a如果a的初值为2,此表达式的求解自右向左进行,等价于a+=(a-=(a*a))。求解步骤如下:①执行赋值运算(a-a*a),即a=2-2*2,使变量a的值为-2,表达式(a-=a*a)的值即为被赋值的变量a的值,也为-2;②再执行a+=-2,即计算a=a+(-2),相当于a=(-2)+(-2)=-4。因此整个表达式a+=a-=a*a的值为-4,变量a的值也为-4。

C语言中,逗号(,)作为一个运算符,可以把几个独立的运算表达式结合成一个运算表达式。这样的表达式称为逗号表达式。例如:(a

=

1,b

=

2,c

=

3)是一个由三个独立的运算表达式结合而成的逗号表达式。

逗号表达式的一般形式为

表达式1,表达式23.6逗号运算逗号表达式的求解过程为:①求解表达式1;②求解表达式2;③将表达式2的值作为整个逗号表达式的值。

例如:表达式(1,2,3)的值为3;表达式(1

+

4,3

-2)的值为1。

说明:

(1)逗号表达式的一般形式可以扩展为

表达式1,表达式2,表达式3,…,表达式n

它是依次求解表达式1至表达式n的值,整个逗号表达式的值为表达式n的值。

(2)逗号运算符在所有运算符中级别最低。

例如:(a

=

1,b

=

2,c

=

3)求解后,a值为1,b值为2,c值为3,整个表达式的值为3。

又如:表达式(a

=

1,a

+

2)的值为3,求解后a值为1。

再如:b

=

(a

=

7,a

+

2),b%3求解后,a值为7,b值为9,表达式的值为0。

条件运算符要求有三个操作对象,称三目(元)运算符,它是C语言中唯一的一个三目运算符。条件运算表达式的一般形式为

表达式1?表达式2:表达式3

它的执行过程是:先计算表达式1,若它的值为真(非0),则计算表达式2,并将表达式2的值作为整个表达式的结果;否则,若表达式1的值为0,则计算表达式3,并将表达式3的值作为整个表达式的结果。3.7条件运算例如:(x>y)?x:y,结果为x和y中的较大数的值。

又如:(x>=0)?x:-x,结果是x的绝对值。

说明:

(1)条件运算符的优先级别比关系运算符和算术运算符的低,比赋值运算符的高。

例如:max=((x>y)?x:y)中的括号可以省略,写成max=x>y?x:y。表达式a>b?

a:b+1则等价于(a>b)?a:(b+1),而不是(a>b?a:b)+1。

(2)条件运算符的结合方向为“自右至左”。例如:a<b?a:b<c?b:c相当于a<b?

a:(b<c?b:c)。

(3)表达式1的类型可以与表达式2和表达式3的类型不同。例如:(x=2)?'a':'b'中,表达式x=2的值的类型为整型,表达式2和表达式3的值的类型均为字符型。

(4)条件运算表达式中,表达式2和表达式3的类型也可以不同,此时条件表达式的值的类型取二者中较高的类型。例如:

(x>y)?1.5:2

如果x>y,则该条件表达式的值为1.5,否则,表达式的值为2,但由于1.5是实型,比整型高,因此将2转换为实型值2.0。

与其他高级语言不同,C语言支持全部的位运算符。位运算是对字节或字中的位进行测试、置位或移位处理。C语言提供的位运算符如表3.7所示。3.8位运算

表3.7位运算符说明:

(1)位运算符中,除~外,均为二目(元)运算符,即要求运算符两侧各有一个运算对象。

(2)位运算只能用于整型或字符型的数据,不能用于实型数据。

(3)位运算符可以与赋值运算符结合,组成位复合赋值运算符,有<<=,>>=,&=,^=,|=。

下面依次介绍几种位运算符,以及位复合赋值运算符。

1.取反运算

取反运算符(~)为单目运算符,其优先级别与其他单目运算符相同,并且同级时自右向左结合。

取反运算符将每个二进制位1变成0,0变成1。例如,~012是对八进制数12(即二进制数0000000000001010)按位取反:

0000000000001010

1111111111110101

即八进制数177765。因此,~012的值为八进制数177765。

2.按位与、按位或及按位异或运算

按位与(&)、按位或(|)及按位异或(^)运算是对两个操作数(8位或16位)的对应二进制位进行运算,每个二进制位的值只可能是0或1。两位间的按位与、按位或及按位异或运算关系如图3.4所示。

图3.4按位逻辑运算按位与运算符(&)只有当两个操作数的对应位上都为1时,&才把该位置成1。按位或运算符(|)只要两个操作数的对应位上有一个为1,|

运算符就把该位置成1。按位异或运算符(^)只有两个操作数的对应位不相等时(其中一个为0,另一个为1),^

就将该位置成1;否则,该位为0。图3.4只对单个位给出了按位逻辑运算关系。在C语言中,位逻辑运算符实际上要对左右两个操作数的每个相应的位进行上述操作。例如,两个8位数01011101和11001011进行位逻辑运算的结果如下:

3.移位运算

移位运算符<<和>>均为双目运算符,它们只能对整型操作数进行运算。

左移运算符<<的一般使用形式如下:

表达式1<<表达式2

其中,表达式1是被移位的运算对象,表达式2是移位数。上式表示将表达式1左移表达式2给定的位数。将表达式1左移后,右边腾出来的空位置为0,高位左移后溢出舍弃。

例3.1

左移运算符<<的应用。

#include<stdio.h>

main()

{

intx=1;

printf("%d,%d,%d,%d\n",x,x<<1,x<<2,x<<3);

}

输出的结果如下:

1,2,4,8这就是说,某整型量若左移n位,就相当于将其乘上2n。本例中,1左移1位时相当于乘2,左移2位时相当于乘22=4,左移3位时则相当于乘23=8。

右移运算符>>与左移运算符的不同之处是:右移后左边腾出来的位上应置的值,因>>左边表达式的类型以及所用的机器和编译环境而异。如果左边操作数为无符号类型,则右移后腾出来的位总用0填充。然而,若左边的操作数是有符号整型,右移后就有符号位的问题。如果原来符号位为0(该数为正),则左边腾出来的位上也总是置0。但如果原来符号位为1(该数为负),则左边是移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的系统移入1。移入0的称为“逻辑右移”,即简单右移;移入1的称为“算术右移”。例如,a的值为十六进制数0x8102,分别进行逻辑右移和算术右移:

a: 1000000100000010

a>>1: 0100000010000001 (逻辑右移)

a>>1: 1100000010000001 (算术右移)

在有些系统中,a>>1得到十六进制数0x4081,而在另一些系统中可能得到的是十六进制数0xC081。大多数编译程序采用的是算术右移,即对有符号数右移时,要将符号位也向右延伸。

4.位复合赋值运算符

<<=,>>=,&=,^=,|=

属于位复合赋值运算符。

例如:a&

=

b相当于a

=

a&b,a<<=2相当于a

=

a<<2。

sizeof是单目(元)运算符。它作用于变量名或C语言类型名,返回的是该变量或该类型的数据在C语言中所占的字节数(长度)。例如:

floatf;

sizeof(f):返回float型变量f所占字节数为

4。

sizeof(int):返回int类型数据所占字节数为

2。

本书的第九章将会介绍sizeof运算符的用途。3.9测试数据长度运算

一、选择题

1.表达式“(a=4*5,b=a*2),b-a,a+=2”的值是()。

A.

2 B.

20 C.

22 D.

42

2.已知有声明语句intx=8,则下列表达式中,值为2的是()。

A.

x+=x-=x

B.

x%=x-2

C.

x>8?x=0:x++

D.

x/=x+x习题3

3.逻辑“异或”运算可描述为“axorb”,其中a和b为参加运算的两个操作数,运算结果为当且仅当a、b两个操作数中只有一个为真时才为真,其他情况下均为假。以下表达式中()可以

温馨提示

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

评论

0/150

提交评论