收藏 分享(赏)

《C语言》课件-2.ppt

上传人:jinchen 文档编号:8117686 上传时间:2019-06-09 格式:PPT 页数:36 大小:1.40MB
下载 相关 举报
《C语言》课件-2.ppt_第1页
第1页 / 共36页
《C语言》课件-2.ppt_第2页
第2页 / 共36页
《C语言》课件-2.ppt_第3页
第3页 / 共36页
《C语言》课件-2.ppt_第4页
第4页 / 共36页
《C语言》课件-2.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、第2章 数据类型、运算符与表达式,1.,2.,3.,本章讲述内容:,5.,C语言的基本数据类型 ;,C语言认可的常量及其表示法 ;,C语言中变量的数据类型、存储类型 ;,C语言中的运算符和由它们组成的表达式 。,4.,C语言中完整变量说明的组成 ;,未带星号的数据类型,在C语言的保留字里有自己的名字,它们的长度是已知的。一个常量或变量若有这样的数据类型,那么它占用的字节数,C语言早就规定好了。,实型被分成单精度和双精度,即是日常所说的实数。,2.1 C语言的数据类型,所谓一个数据的“数据类型”,是该数据自身的一种属性,它告诉编译程序,这个数据要在内存中占用多少个字节。程序中涉及的各种数据(常量

2、、变量),都必须存放在内存里,因此这是数据的极为重要的信息。,.,.,C语言的各种数据类型,数据类型,基本类型,结构类型,指针型,空类型,整型,实型,字符型,带符号整型,无符号整型,带符号整型,带符号短整型,带符号长整型,无符号整型,无符号短整型,无符号长整型,单精度型,双精度型,数组型,结构型(*),共享型(*),枚举型(*),(1),在基本类型中,虽把整型数据分成带符号整型与无符号整型两种,又各有短和长之分,其实那是我们最熟悉的数据类型,即是日常所说的整数。,(2),(3),(4),带有星号的数据类型,是C语言没 给出定义的类型。若要使用,必须编程者自 己先给出定义,确定其占用的字节数,才

3、能说明具体的变量。,不同类型数据所占用的内存区域大小是不同的,这个区域的字节数被称为是这种数据类型的“长度”。,.,基本数据类型,数据类型符,占用字节数(长度),整型,int,2,短整型,short int,2,长整型,long int,4,无符号整型,unsigned int,2,无符号短整型,unsigned short,2,无符号长整型,unsigned long,4,单精度实型,float,4,双精度实型,double,8,字符型,char,1,.,“结构型”、“共用型”、“枚举型”的称谓,只是一种笼统提法。比如用户要在自己的程序里使用所谓的结构型数据类型,那么必须先给出这个结构型数据

4、类型的定义:它叫什么名字,它由哪些成分构成(从而知道一个这种类型的数据总共需要占用多少个字节)。然后,才能用这个名字去说明一个变量,使其具有这种结构型的数据类型。至于定义一个结构型、共享型或枚举型的数据类型的方法,将在第7章中介绍。,2.2 常 量,2.2.1 整型常量,.,所谓“常量”,是指在程序执行过程中,其值不能改变的量。C语言中有四种常量:整型常量、实型常量、字符常量和字符串常量。一个常量的类型,由它的书写格式确定,无须事先加以说明。,.,值为整数的常量称为“整型常量”,简称“整常量”,它包括正整数、零和负整数。整常量的数据类型是整型(int)的。,.,整常量的十进制、八进制和十六进制

5、书写形式,(1),十进制整常量的书写形式,十进制整常量是通常意义下的整数。例如,112,2 008,58,0等。要注意,在C语言中用十进制表示整常量时,第一个数字不能是0(除了0本身外)。,(2),八进制整常量的书写形式,八进制整常量是在通常意义下的八进制整数前加上前缀数字“0”构成的。0112是八进制数112,即是十进制的74;00表示八进制数0,也是十进制的0。,(3),十六进制整常量的书写形式,十六进制整常量是在通常意义下的十六进制整数前加上前缀“0x”(数字0和小写字母x)构成。0x15表示十六进制数15,它是十进制的21;+0xFF表示十六进制数+FF,它是十进制的+255;0x0表

6、示十六进制数0,也就是十进制的0 。,.,八进制和十六进制整常量前的前缀“0”和“0x”,只起标识作用,用来避免与C语言的标识符相混淆,否则C编译程序无法区分哪些是标识符,哪些是整型常量,没有什么实际的意义。,.,整型或短整型常量要占用内存的2个字节,存放时是将其相应的二进制数放在2个字节(16个二进制位)里,其数值范围是十进制的 32 768+32 767 ;长整型常量要占用内存的4个字节,存放时是将相应的二进制数放在4个字节(32个二进制位)里,其数值范围是十进制的2 147 483 648+2 147 483 647。若是长整型常量,在程序中书写时,需在它的末尾加上小写字母“l”,或大写

7、字母“L”,以便区分。,例:,画出整常量286、0374和0x8A6C在内存中的存放形式。,解:,C总是将数值转换成二进制数后存放在单元里的。,0374(= 27 + 26 + 25 + 24 + 23 + 22)是八进制整常量,占内存2个字节:,0x8A6C(= 215 + 211 + 29 + 26 + 25 + 23 + 22)是十六进制整常量,占内存2个字节:,286:,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0374:,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0x8A6C:,1,0,0,0,1,0,1,0,0,1,1,0,1,1,0,0

8、,286(=28 + 24 + 23 + 22 + 21)是十进制整常量,占内存2个字节:,(1),(2),(3),12、012和0x12是整型常量,分别是十进制整数、八进制整数和十六进制整数;12L、012L和0x12L是长整型常量,分别是十进制长整数、八进制长整数和十六进制长整数。注意,虽然12和12L有相同的数值,但12在存储器中占用2个字节,12L在存储器中占用4个字节。,区分12、012、0x12、12L、012L、0x12L哪些是整型常量,哪些是长整型常量?,例:,解:,例:,解:,编写一个程序,将十进制整数31,按照十进制、八进制和十六进制的形式输出。,程序实现,(1),#inc

9、lude “stdio.h“ main() printf (“the decimal number of 31 = %d n“, 31);printf (“the octal number of 31 = %o n“, 31);printf (“the hexadecimal number of 31 = %x n“, 31); ,(2),分析与讨论,由于格式符“%d”、“%o”、“%x”能够控制数据的输出形式,因此在函数printf()里,可利用“%d”、“%o”和“%x”分别决定31以十进制形式、八进制形式以及十六进制形式的输出。程序运行后,观察用户窗口,其输出如图所示。,.,2.2.2

10、实型常量,.,值为实数的常量称为“实型常量”,简称“实常量”。在C语言中,实常量只有十进制的书写形式,没有八进制和十六进制的实常量。,.,在C语言中,十进制的实常量可以用一般形式与指数形式两种办法来表示。,(1),一般形式的十进制实常量就是通常的实数,由整数、小数点和小数3部分构成。小数点是必须的,整数或小数部分可以省略。例如12.245、1.2345、0.618、.123、123.,都是C语言中合法的实常量。要注意:123表示整数,123.表示实数。,(2),指数形式的十进制实常量由尾数、小写字母e或大写字母E以及指数3部分构成。e或E必须要有,尾数部分可以是整数,也可以是实数。指数部分只能

11、是整数 (可以带+或符号)。例如2.75e3,6.E5,.123E+4等都是C语言合法的以指数形式表示的实常量;而.E8,e3,3.28E,8.75e3.3等都不是C语言合法的实常量。,可用不同的尾数和指数表示同一实数。若尾数写成是小数点前有且仅有一位非0数字,那就称它为“规范化的指数形式”。比如,125.46规范化的指数形式是1.2546e2。在C语言中,以指数形式输出实数时,都按规范化的指数形式输出。,.,实常量属于实型。如果它是单精度的,则要用内存的4个字节来存放它;如果它是双精度的,那么要用内存的8个字节来存放它。在printf()函数里,若把格式符换成“%f”或“%e”,就可把要输出

12、的实型值,按一般形式或指数形式(单精度)加以输出。,.,在printf()函数里,如果把格式符换成“%c”,就可以把要输出的字符常量按对应的字符形式打印出来。,2.2.3 字符常量,C语言中,用一对单引号前、后括住的单个字符被称为“字符常量”。比如,b、G、=、%、 n、x41和110等,都是字符常量。若要得到反斜杠“”这个字符常量,在程序中应写成;要得到单引号“”这个字符常量,在程序中应写成“。,.,.,C语言区分大小写,因此a和A是两个不同的字符常量。字符常量为字符(char)型数据,在内存需一个字节(8个二进制位)来存放该字符的ASCII码值(见附录2)。,.,ASCII码的数值范围是十

13、进制的0128。若限制整常量的值在0128之间,那么从整常数的角度看,它是这个整常数的数值;从字符常数的角度看,它是某字符的ASCII码值。所以,在0128之间,整常量和字符常量可以通用。,.,例:,编写一个程序,将整常量100 按十进制和字符两种形式加以输出;将字符常量9按字符和十进制两种形式加以输出。,#include “stdio.h“ main() printf (“the decimal form of 100 is %d n“, 100);printf (“the character form of 100 is %c n“, 100);printf (“the character

14、 form of 9 is %c n“, 9);printf (“the decimal form of 9 is %d n“, 9); ,2.2.4 字符串常量,.,在C语言中,用一对双引号前、后括住的零个或若干个字符,被称为“字符串常量”,简称“字符串”。如“a character string“、“G“、“486“和“t“Name Addressn“等都是字符串。要注意,若双引号内没有何字符,即“,称为“空字符串”。,.,一个字符串中所含的字符个数,称为该“字符串的长度”。字符串中若有转义字符,应把它视为一个字符来计算。,.,内存中存放字符串时,是存放串中每个字符的ASCII码值。各字符

15、串所含字符数是不同的,因此在存放完字符串里的字符后,还要用一个字节存放一个ASCII码值为0的字符,以标识该字符串的结束。这个ASCII码值为0的字符,称为“空字符”,程序中以转义字符“0”的形式来书写,它是字符串的“结束标记”。,例:,解:,画出字符串“This is a book“在内存中的存放形式。,该字符串共14个字符,因此要分配给它15个字节,前14个字节存放14个字符对应的ASCII码值,最后一个字节存放字符串结束符“0”。图中,每一个字节里存放的数值,是该字符的十进制ASCII码值,下面列出的是ASCII码值对应的字符。,84,104,0,105,115,32,105,115,3

16、2,97,32,98,111,111,107,T,h,i,s,i,s,a,b,o,o,k,0,空格符,字符串结束符,ASCII码值,对应的字符,0是视空字符(即NULL)为一个字符常量。在内存里用一个字节存放它的ASCII码值(十进制的0)。,例:,在C语言中,a和“a“有什么区别?,97,97,0(或NULL),(1),a是一个字符常量。在内存中,用一个字节存放a,存放字母a的ASCII码值(十进制的97)。,(2),“a”是一个长度为1的字符串常量。在内存中,要用两个字节存放“a”,第一个字节存放字母a的ASCII码值(十进制的97),第二个字节存放字符串结束符“0”。,内存中的字符a,内

17、存中的字符串”a”,例:,在C语言中,1、1和“1“有什么区别?,(1),(2),1是整型常量,在内存里要用两个字节来存放1的二进制数值 。,(3),1是字符常量,在内存里要用一个字节来存放字符1的ASCII码值(十进制的49)。,“1”是长度为1的字符串常量,在内存里用两个字节来存放,第1个字节放字符1的ASCII码值(十进制的49),第2个字节放字符串结束符“0” 。,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0(或NULL),数值1在内存中的表示,字符常量1在内存中的表示,字符串常量”1”在内存中的表示

18、,在C语言中,0和0有什么区别?,例:,(1),0是一个字符常量,在内存里将用一个字节存放它的ASCII码值(十进制的48)。,(2),0,0,0,0,0,1,1,0,字符常量0在内存中的表示,0,0,0,0,0,0,0,0,字符常量0在内存中的表示,.,在printf()函数里,用格式符“%s”可按原样输出字符串常量。,2.3.1 变量的数据类型,2.3 简 单 变 量,1.,.,程序执行过程中,允许其值发生变化的量,称为“变量” ,通常用变量来保存程序执行时的输入数据、中间结果以及最终结果等。,.,用户应为程序中用到的每个变量起名字,以示区别。为变量取的名字,称为“变量名”。为变量起名应符

19、合标识符的命名规则。,在程序中说明一个变量时,完整做法是:给出变量的名字(以示区别),给出变量的数据类型(以决定所分配存储区的大小),给出变量的存储类型(以表明对存储区是长期占用还是临时使用),还可给出变量的值(初始化)。,.,程序中使用每个变量之前,必须先进行“变量说明” :起一个名字(变量名)并指定它的数据类型。变量说明语句的基本格式是:;,.,整型变量的说明,用数据类型符int,将一个变量说明为是整型的。比如:int x; 传达的信息是有一个名为x的整型变量,因此它要在内存占用2个字节来存放其值,取值范围是32 768+32 767。,.,signed int与unsigned int的

20、区别在于对该数的(二进制)最高位的解释不同。前者是把最高位当作符号位看待,后者的最高位仍用于存储数据。,若在说明一个整型变量时含有修饰符signed、unsigned、long或short等,那么int可以省略不写。即long int y; 与 long y;所说明的变量含义相同。,.,在整型变量说明符int的前面加上修饰符signed、unsigned、long或short后,就可以说明一个变量是带符号的、无符号的、长型的或短型的等等。,对整型变量说明的几点注意,.,(1),(2),int在前没有修饰符时,默认为是带符号的,即int就是signed int。,(3),2.,实型变量的说明,用

21、数据类型符float或double,将一个变量说明为是单精度实型的或双精度实型的。比如:float x; 表示x是一个单精度实型变量,需要4个字节来存放值。比如:double nt; 表示nt是一个双精度实型变量,需要8个字节来存放值。,.,3.,字符型变量的说明,用数据类型符char,将一个变量说明为是字符型的。比如:char ch; 表示说明变量ch是字符型的,要在内存中分配1个字节来存放它的ASCII码值。,.,在一个变量说明语句中,可以同时说明多个相同数据类型的变量。比如:int a, b, c; 说明了变量a、b和c都是整型的,它们每一个都需要2个内存字节来存放自己的取值。,4.,关

22、于变量数据类型说明的几点注意,.,任何变量都必须遵循“先说明后使用”的原则。只有说明了的变量,才能在程序中使用;若违反了“先说明后使用”的规则,程序就不会通过编译。,.,.,变量数据类型的说明可以放在一个程序所有函数的外面,也可以放在某个函数的里面。在函数里面说明的变量,必须将其集中安放在该函数的最前面。一个变量的说明是放在函数外或放在函数内,所起的作用是不相同的。,.,在同一个函数中说明多个变量时,其变量名不能相同。,.,在C语言中,只有字符串常量,没有字符串型的变量。,2.3.2 变量的存储类型,一个变量被分配在静态存储区还是动态存储区,这将由变量的存储类型来决定。,1.,变量的存储类型,

23、.,系统分配给用户使用的三个内存存储区:应用程序区存放用户程序;静态存储区存放程序执行全过程中都需保存的那些数据;动态存储区存放程序执行时,临时需要保存的那些数据。,.,.,C语言的存储类型符,存储类型,自动型,寄存器型,静态型,外部型,存储类型符,存储地点,auto,register,static,extern,动态存储区,CPU的通用寄存器,静态存储区,静态存储区,.,为说明一个变量的存储类型,只需在变量说明语句里添加存储类型符即可。这时的变量说明语句格式成为:;,比如,有两个变量说明语句:static int x;auto float z; 表示要在内存的静态存储区为整型变量x分配2个字

24、节的存储区;在内存的动态存储区为单精度实型变量z分配4个字节的存储区。,.,自动型变量,2.,把存储类型符auto加在变量名及其类型前面,该变量就成为一个自动型变量,简称自动变量。C语言在动态存储区里为其分配存储区。,.,.,有关自动变量的几点注意,(1),只能在函数内说明自动变量。,如果一个变量是自动型的,那么保留字auto可以省略不写。正因为如此,前面所举例子中的变量,都属于自动型。,(2),(3),在不同函数中说明的自动变量,可以使用相同的名字,它们的类型可以相同,也可以不同,彼此不会产生干扰。,寄存器变量,3.,.,数据放在寄存器里,操作起来比在内存里快。可通过保留字register,

25、把一个变量说明为是寄存器型的,这样C的编译程序就会把该变量放在CPU的一个通用寄存器中参与操作。,.,有关寄存器变量的几点注意,(1),只能在函数的内部说明寄存器型变量。,(2),CPU中的通用寄存器数量有限,因此程序中不能同时说明多个寄存器型变量,一般以2个为宜。如果超出,编译程序会把它们设为自动型变量。,(3),不能把long、float和double型的变量定为寄存器型的。,(4),现在经过优化的编译程序,会判别使用频繁的变量,并把它们自动存放到寄存器中,而不需要程序设计者人为指定。因此,现实程序中极少使用寄存器型变量。,静态型变量,4.,.,把存储类型符static加在变量名及其数据类

26、型前面,就成为一个静态型变量,简称“静态变量”。C语言在静态存储区里为静态变量分配存储区。,.,静态变量可以在函数内部说明,也可以在函数外部说明。本书只涉及在函数内部说明的静态变量。,有关静态变量的几点注意,(1),(2),在整个程序运行期间,静态变量一直占据分配给它的存储区不予归还,直到程序运行结束。,外部型变量,5.,.,把存储类型符extern加在变量名及其数据类型前面,该变量就成为一个外部型变量,简称“外部变量”。C语言在静态存储区里为外部变量分配存储区。,.,C语言允许对源程序分别编译,然后再连接装配。因此会发生这样的情形:源程序乙要用到源程序甲中的某个变量。为了向编译程序提供这方面

27、的信息,源程序甲就应该把这个源程序乙要用到的变量的存储类型说明为是extern型的,表示允许别的源程序使用。,.,关于变量存储类型说明的几点注意,6.,若多个变量有相同的存储类型和数据类型,那么可用一个语句做统一的说明。,.,通常,在变量说明语句中,总是在变量名前先写变量的存储类型符(如果写的话),再写变量的数据类型符。不过,存储类型符和数据类型符的书写顺序可以颠倒。,对自动型和寄存器型变量,若在说明时进行了初始化,那每次运行到该变量所在函数时,都会再次被初始化;若在说明时没做初始化,那在执行到第一次赋予它值的语句之前,它的值是不确定的。只有赋予它值后,才能参与运算。,2.3.3 变量的初始化

28、与完整的变量说明语句,.,若在对变量说明的同时给变量赋予值,则称是“变量的初始化”。一个完整的变量说明语句有如下的格式:= ;例如:char ch1 = A, ch2 = g, ch3 = F;static int fir_var = 12;float num = 14.56;,在说明一个变量时,不一定非进行初始化。不过,对于不同存储类型的变量,在说明时进行或不进行初始化,其效果不尽相同。,.,(1),(2),对函数内的静态型变量,若在说明时进行了初始化,那该初始化只在第一次运行时进行,下次再运行到该变量所在函数时,不会重新初始化,而是继承上次运行后保留的值参与这次运算;若说明时没进行初始化,

29、那C会自动进行初始化:将整型变量赋予初值0,实型变量赋予初值0.0,字符型变量赋予初值空字符,下次再运行到该变量所在函数时,不会重新初始化,而是继承上次运行后保留的值参与这次运算。,程序中说明了两个字符型变量c1和c2,并做了初始化。第1个printf()把c1、c2视为字符看待 (%c),应输出字母a和e。第2个printf()把c1、c2视为数值看待(%d),应输出97和101。printf()里的“t”是转义字符,表示输出一个制表符(Tab) 。所以程序执行后的输出结果为:a e97 101,例:,解:,阅读程序,给出输出结果。,#include “stdio.h“ main() cha

30、r c1=97, c2=101;printf (“%ct%cn“, c1, c2);printf (“%dt%dn“, c1, c2); ,例:,编写一个程序,从键盘输入一个字符后,把该字符的ASCII码值加1,输出新字符。,#include “stdio.h“ main() char ch; scanf (“%c“, ,(1),程序实现,(2),分析与讨论,.,字符数据以字符形式输出时,是先将其的ASCII码值转换成相应字符,然后输出;以整数形式输出时,就是直接将ASCII码值作为整型数输出。,.,在一定范围内字符型数据和整型数据间是通用的,所以可对字符型数据进行算术运算,即对其ASCII码

31、值做算术运算。程序中printf (“%cn”, ch+1)表示将键盘输入的字符(存在变量ch里)的ASCII码加1后以字符形式输出,因此是该字符后面的那个字符。比如,输入A(ASCII码为65),加1后就应该输出B(ASCII码为66)。,#include “stdio.h“ main() int x = 64; float y = 44.23; char ch = K; int j = 125;printf (“the value of x is %d, the address of x is %un“, x, ,2.3.4 变量地址与取地址符“&”,.,在程序中说明一个变量后,内存就会有

32、一个存储区与之对应。这个存储区的第1个字节的地址,就称为是该变量的“地址”。,.,C语言里,一个变量的地址要通过在变量前加“&”符号来得到,称“&”为“取地址符”。,.,变量的地址是一个无符号的数值。在printf()函数里如果把格式符换成“%u”,就可以把系统分给某个变量的地址打印出来。,例:,编写一个程序,将分配给变量的地址打印出来。,(1),程序实现,(2),分析与讨论,65490,65492,65497,65498,64,44.23,75,125,2.4 C语言的运算符与各种表达式,.,用来表示各种运算的符号称为“运算符”。只需一个运算对象的运算符,称为“单目运算符”;有的需两个,称为

33、“双目运算符”;最多需要3个,称为“三目运算符”。,.,用运算符把运算对象连接在一起组成的式子,称为“表达式”。每种表达式按照运算符的运算规则进行运算,最终都会得到一个结果,称为“表达式的值”。,.,表达式中有多个运算符时,先做哪个运算,后做哪个运算,必须遵循一定的规则,这种运算符执行的先后顺序,称为“运算符的优先级”。圆括号能改变运算的执行顺序。,.,对于优先级相同的运算符,将由该运算符的结合性来决定它们的运算顺序。C语言中同级别运算符可以有两种结合性:所谓结合性是“自左向右”的,意即由左向右遇到谁就先做谁;所谓结合性是“自右向左”的,意即由右向左遇到谁就先做谁。学习C语言时,必须关注那些结

34、合性为自右向左的运算符。,2.4.1 算术运算符与算术表达式,由算术运算符把数值型运算对象连接在一起,就构成了所谓的“算术表达式”。,.,.,除法运算符:/,该运算符的运算规则与运算对象的数据类型有关:若两个运算对象都是整型的,则结果是取商的整数部分,舍去小数(也就是做整除);若两个运算对象中至少有一个是实型的,那么结果是实型的,即是一般的除法。,1.,该运算符的两个运算对象必须是整型的,结果是整除后的余数(即求余),符号与被除数相同。比如,14%5的结果是4;64%6的结果是4;13%3、13%3的结果都是1(商分别是4、4);13%3、13%3的结果都是1(商分别是4、4)。,增1、减1运

35、算符都是单目运算符,运算对象只能是变量,且变量的数据类型限于整型、字符型,以及以后要学习的指针型、整型数组元素等。,分析如下程序的输出结果。,例:,#include “stdio.h“ main() int x = 26, y = 8;float f = 26.0;printf (“26/8 = %dn“, x/y);printf (“26.0/8 = %fn“, f/y); ,第1个printf()要打印输出x/y,即是求分数26/8的结果。由于这时分子和分母都是整数,所以执行的是整除,结果为3;第2个printf()要打印输出f/y。这时的分数是26.0/8,分子是实数,所以执行的是一般除

36、法,结果为3.250000。注意:第2条printf()中的格式符是“%f” ,而不是“%d”。,解:,.,模运算符:%,.,2.,增1、减1运算符:+和-,3.,.,增1、减1运算符的操作是自动将运算对象实行加1或减1,并把运算结果回存到运算对象中。所谓“回存”,是“仍然存放到运算对象的存储单元”的意思。,.,增1、减1运算符它们既能出现在运算对象之前,比如:+i,-j,成为所谓的“前缀运算符”;也能出现在运算对象之后,比如:x+,y-,成为所谓的“后缀运算符”。,.,前缀式增1、减1运算符,是先对运算对象完成加、减1和回存操作,然后才去使用该运算对象的值;后缀式增1、减1运算符,是先使用该

37、运算对象的值,然后才去完成加、减1和回存操作。,#include “stdio.h“ main() int a = 3, b = 5; printf (“a=%dn“, +a);printf (“a=%dn“, a);printf (“b=%dn“, b-);printf (“b=%dn“, b); ,分析如下程序的输出结果。,例:,第1条printf()是要把+a打印出来。由于运算符+为前缀式的,所以在打印前(即使用a值之前),应先做对a加1和回存的操作,然后才打印,因此输出a=4 。,由于a里的内容已因回存而变为4,因此执行第2条printf()时,输出的也是a=4。,第3条printf(

38、)是要把b-打印出来。由于运算符-为后缀式的,所以应先使用(即打印)b的值,然后才去完成对b减1和回存的操作。故第3条printf()打印输出b=5。,由于第3条printf()使用完b的值后,要对它减1和回存,于是b里的内容变为了4。故第4条printf()输出b=4。,(1),(2),(3),(4),第1条printf()中的+a,相当于(+a)。即对变量a应先完成+,然后再取负打印,所以它输出9。,.,关于增1、减1运算符的几点注意,(1),+和-只能作用在变量上,而不能用于常量和表达式。,(2),+和-组成了两个新的运算符,不是通常意义的两个加号或两个减号。因此在录入源程序时,不能在+

39、或-中间插入空格。,在表达式中遇到连续多个加号或减号情形时,C语言规定从左向右尽可能多地将若干个加号或减号组成一个运算符。比如:i+j将理解为是(i+)+j,而不是i+(+j)。,(3),分析如下程序的输出结果。,例:,(1),#include “stdio.h“ main() int a = 8;printf (“%dt“, -+a);printf (“%dn“, a);printf (“%dt“, -a+);printf (“%dn“, a); ,(2),由于前面对a做了+,所以a的内容变为9。因此第2条printf()仍应输出9。,(3),第3条printf()应理解为是(a+)。这时+

40、在a的后面,所以先应输出a,即9以后,然后再对a进行+。所以第4条printf()输出10。,(4),“t”表示要输出一个制表符, “n”表示要输出一个回车换行。所以,第1、2条printf()语句输出的内容在同一行上,第3、4条printf()语句输出的内容在同一行上。,应把算术自反运算符右边的表达式视为一个整体来对待。比如:“x*=y+5”等效于“x=x*(y+5)”,而不应理解为“x=x*y+5”。后者是错误的。,算术自反赋值运算符的作用是把“运算”和“赋值”两个动作结合起来,成为一个复合运算符。这组算术自反赋值运算符都是双目运算符。由于本质上它们都是进行赋值,所以运算符左边必须是变量,

41、右边是表达式。,.,算术自反赋值运算符:+=、=、*=、/=和%=,2.,.,以“+=”为例,其形式为:+= 含义是先把运算符左边变量的当前值与右边表达式的值进行“+”运算,然后把结果赋给左边的变量。即:x+=2等价于x=x+2。因此这些表达式也称为“赋值表达式”。,例:,有变量说明:int x = 8, y = 8, z = 8;。执行语句x=yz;后,x、y、z的值各多少?,解:,该语句等同于x=x(yz); ,即是x=xy+z;。按x,y,z的值计算右边表达式,求得结果为5。将其赋给左边的变量x。于是x取值5。由于语句x=yz;,只改变x的值,变量y,z的取值不受影响。所以最终3个变量的

42、值为:x=5,y=8,z=8。,.,关于算术自反运算符的几点注意,(1),(2),由于运算符“%”本身的限制,算术自反运算符“%=”也只能用于整型数据,即它左边变量的当前值应该是整型的,右边表达式的值也应该是整型的。,C语言里的赋值运算符虽然形同数学中的等号,但它已完全丧失了“等于”的原义,这是必须注意的。在C语言里把“x=5;”读作“把数值5赋予变量x”,不能读作“x等于5”。,程序中说明变量x时没初始化。随后的“x=56.57;”是一条赋值语句,它把右边的数值56.57存入变量x的单元中。所以printf()将输出x=56.570 000。,2.4.2 赋值运算符与赋值表达式,.,基本赋值

43、运算符:=,1.,基本赋值运算符简称“赋值运算符”。赋值运算符是双目运算符,使用时左边必须是变量,右边是表达式,即具有形式:= ,.,赋值运算符的含义是先计算赋值号“=”右边表达式的值,然后把结果赋给(即存入)左边的变量。这样的式子称为“赋值表达式”。,.,在赋值表达式的后面加上语句结束符分号,就成为一个“赋值语句”。它是C语言程序中使用得最为频繁的语句。,分析如下程序的输出结果。,例:,(1),#include “stdio.h“ main() float x;x = 56.57;printf (“x = %fn“, x); ,(2),程序中变量a和b说明时初始化为3和5,x、y、z是由赋值

44、语句得到值的。,2.4.3 关系运算符与关系表达式,.,所有关系运算符都是双目的。用关系运算符将两个运算对象连接起来所形成的表达式,称为“关系表达式”。,.,关系运算符的作用是比较左、右两个运算对象,测试它们之间是否具有所要求的关系。关系表达式的最终结果是逻辑值:如果关系成立,则表达式取逻辑值“真”,用数值1表示;如果关系不成立,则表达式取逻辑值“假”,用数值0表示。,关系表达式中的运算对象可以是数值型的,也可以是字符型的。若是字符型的,则是按照它们的ASCII码值来进行比较。,.,.,要特别区分符号“=”和符号“=”。前者是关系运算符,表示检验左右两个量之间是否具有“等于、相等”的关系;后者

45、是赋值运算符,表示把右边的表达式值赋给(或存入)左边的变量。,试分析下面的程序输出 。,例:,#include “stdio.h“ main() int a = 3, b = 5, x, y, z;x = a b; y = a b;z = a = b;printf (“x = %d, y = %d, z = %dn“, x, y, z); ,(1),(2),现在变量a的值为3,b的值为5,关系ab和a=b不成立,关系ab成立。因此顺序执行3条赋值语句后,分别把值0赋给变量x,值1赋给变量y,值0赋给变量z。printf()最终输出为:x = 0, y = 1, z = 0,逻辑非运算符是一个单

46、目运算符,它作用在其右的运算对象上,运算结果是得到运算对象的“反” 。,2.4.4 逻辑运算符与逻辑表达式,.,C语言的逻辑运算符及其含义,名称,运算符,运算对象个数,含 义,逻辑非,!,单目,真为“假”,假为“真”,逻辑与,&,双目,左右都成立才为“真”,逻辑或,|,双目,左右有一个为真时就为“真”,.,C语言逻辑运算符的运算规则,a,b,a&b,a|b,0,0,0,0,0,1,0,1,1,0,0,1,!a,1,1,1,1,1,1,0,0,.,逻辑非运算符:!,1.,.,比如:int x = 5;。因x不为0,表示逻辑值为1。因此,!x的值为0。另外,x5的值是0,所以,表达式!(x5)的值

47、为1。这就是说,若要将一个条件的含义在原来的基础上“反转”过来,用“!”就能够达到目的。,该运算符作用在左、右两个运算对象上,只有当它们同时为真时,整个逻辑表达式才为真;只要其中有一个为假,整个逻辑表达式就是假。所以,若希望两个条件都为真时才做某事,就应把它们放在“&”的两侧。,.,逻辑与运算符:&,2.,.,比如逻辑表达式:7&9。由于左、右都是非0数值,表示为真,因此整个表达式取值为真(即1)。又如逻辑表达式:100&(88),左边为真,右边为假,所以整个表达式的取值为假(即0)。,.,逻辑或运算符:|,3.,该运算符作用在左、右两个运算对象上,只要它们中有一个为真时,整个逻辑表达式就取值

48、真;只有它们都为假时,整个逻辑表达式才是假。所以若希望两个条件中的一个为真时就去做某件事,那就应把这两个条件放在“|”的两侧。,.,比如逻辑表达式:7|0。由于左边为真,所以整个表达式取值为真(即1)。又比如有说明:“int a = 5, b = 8;”,那么表达式“a b | a != b”的结果为真。这是因为虽然关系表达式:ab不成立,但是关系表达式a!=b却成立。,用关系运算符只能形成简单的比较条件。要把多个简单的条件组合成复杂的条件,就必须利用逻辑运算符。,通过逻辑运算符组成复杂的条件,4.,.,要表示“x大于a小于b”的数学关系“a a & x b,.,再去计算这个逻辑表达式右边的条件,而直接把逻辑值0赋给变量x。正因为没有去计算右边表达式的取值,所以并没有做把关系表达式ab的值赋给变量n的操作。即变量n仍保持它原有的值10。,变量m、n、a、b的初值都是10。赋值语句:x = (m = ab ) 是把表达式(m = ab ) & (n = ab)的值赋给变量x。&左右两边也都是赋值表达式:左边把表达式ab的值赋给变量m;右边把表达式ab的值赋给变量n。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报