《《C语言》课件-2.ppt》由会员分享,可在线阅读,更多相关《《C语言》课件-2.ppt(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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、若要使用,必须编程者自己先给出定义,确定其占用的字节数,才能说明具体的变量。不同类型数据所占用的内存区域大小是不同的,这个区域的字节数被称为是这种数据类型的“长度长度”。.基本数据类型数据类型符占用字节数(长度)整型int2短整型shortint2长整型longint4无符号整型unsignedint2无符号短整型unsignedshort2无符号长整型unsignedlong4单精度实型float4双精度实型double8字符型char1.“结构型”、“共用型”、“枚举型”的称谓,只是一种笼统提法。比如用户要在自己的程序里使用所谓的结构型数据类型,那么必须先给出这个结构型数据类型的定义:它叫
4、什么名字,它由哪些成分构成(从而知道一个这种类型的数据总共需要占用多少个字节)。然后,才能用这个名字去说明一个变量,使其具有这种结构型的数据类型。至于定义一个结构型、共享型或枚举型的数据类型的方法,将在第7章中介绍。2.2 常量常量o2.2.1 整型常量整型常量.所谓“常量常量”,是指在程序执行过程中,其值不能改变的量。C语言中有四种常量:整型常量、实型常量、字符常量和字符串常量。一个常量的类型,由它的书写格式确定,无须事先加以说明。.值为整数的常量称为“整型常量整型常量”,简称“整常量整常量”,它包括正整数、零和负整数。整常量的数据类型是整型(int)的。.整常量的十进制、八进制和十六进制书
5、写形式(1)十进制整常量的书写形式十进制整常量是通常意义下的整数。例如,112,2008,58,0等。要注意,在C语言中用十进制表示整常量时,第一个数字不能是第一个数字不能是0(除了0本身外)。(2)八进制整常量的书写形式八进制整常量是在通常意义下的八进制整数前加上前缀数字前缀数字“0”构成的。0112是八进制数112,即是十进制的74;00表示八进制数0,也是十进制的0。(3)十六进制整常量的书写形式十六进制整常量是在通常意义下的十六进制整数前加上前缀前缀“0 x”(数字数字0和小写和小写字母字母x)构成。0 x15表示十六进制数15,它是十进制的21;+0 xFF表示十六进制数+FF,它是
6、十进制的+255;0 x0表示十六进制数0,也就是十进制的0。.八进制和十六进制整常量前的前缀“0”和“0 x”,只起标识作用,用来避免与C语言的标识符相混淆,否则C编译程序无法区分哪些是标识符,哪些是整型常量,没有什么实际的意义。.整型或短整型常量要占用内存的2个字节,存放时是将其相应的二进制数放在2个字节(16个二进制位)里,其数值范围是十进制的32768+32767;长整型常量要占用内存的4个字节,存放时是将相应的二进制数放在4个字节(32个二进制位)里,其数值范围是十进制的2147483648+2147483647。若是长整型常量,在程序中书写时,需在它的末尾加上小写字母“l”,或大写
7、字母“L”,以便区分。例例:画出整常量286、0374和0 x8A6C在内存中的存放形式。解解:C总是将数值转换成二进制数后存放在单元里的。0374(=27+26+25+24+23+22)是八进制整常量,占内存2个字节:0 x8A6C(=215+211+29+26+25+23+22)是十六进制整常量,占内存2个字节:286:00000001000111100374:00000000111111000 x8A6C:1000101001101100286(=28+24+23+22+21)是十进制整常量,占内存2个字节:(1)(2)(3)12、012和0 x12是整型常量,分别是十进制整数、八进制整
8、数和十六进制整数;12L、012L和0 x12L是长整型常量,分别是十进制长整数、八进制长整数和十六进制长整数。注意,虽然12和12L有相同的数值,但12在存储器中占用2个字节,12L在存储器中占用4个字节。区分12、012、0 x12、12L、012L、0 x12L哪些是整型常量,哪些是长整型常量?例例:解解:例例:解解:编写一个程序,将十进制整数31,按照十进制、八进制和十六进制的形式输出。程序实现(1)#includestdio.hmain()printf(thedecimalnumberof31=%dn,31);printf(theoctalnumberof31=%on,31);pri
9、ntf(thehexadecimalnumberof31=%xn,31);(2)分析与讨论由于格式符“%d”、“%o”、“%x”能够控制数据的输出形式,因此在函数printf()里,可利用“%d”、“%o”和“%x”分别决定31以十进制形式、八进制形式以及十六进制形式的输出。程序运行后,观察用户窗口,其输出如图所示。.o2.2.2 实型常量实型常量.值为实数的常量称为“实型常量实型常量”,简称“实常量实常量”。在C语言中,实常量只有十进制的书写形式,没有八进制和十六进制的实常量。.在C语言中,十进制的实常量可以用一般形式与指数形式两种办法来表示。(1)一般形式的十进制实常量就是通常的实数,由整
10、数、小数点和小数3部分构成。小数点是必须的小数点是必须的,整数或小数部分可以省略整数或小数部分可以省略。例如12.245、1.2345、0.618、.123、123.,都是C语言中合法的实常量。要注意:123表示整数,123.表示实数。(2)指数形式的十进制实常量由尾数、小写字母e或大写字母E以及指数3部分构成。e或或E必须要有,尾数部分可以是整数,也可以是实数。指数部分只能是整数必须要有,尾数部分可以是整数,也可以是实数。指数部分只能是整数(可以带+或符号)。例如2.75e3,6.E5,.123E+4等都是C语言合法的以指数形式表示的实常量;而.E8,e3,3.28E,8.75e3.3等都不
11、是C语言合法的实常量。可用不同的尾数和指数表示同一实数。若尾数写成是小数点前有且仅有一位非0数字,那就称它为“规范化的指数形式规范化的指数形式”。比如,125.46规范化的指数形式是1.2546e2。在C语言中,以指数形式输出实数时,都按规范化的指数形式输出。.实常量属于实型。如果它是单精度的,则要用内存的4个字节来存放它;如果它是双精度的,那么要用内存的8个字节来存放它。在printf()函数里,若把格式符换成“%f”或“%e”,就可把要输出的实型值,按一般形式或指数形式(单精度)加以输出。.在printf()函数里,如果把格式符换成“%c”,就可以把要输出的字符常量按对应的字符形式打印出来
12、。o2.2.3 字符常量字符常量C语言中,用一对单引号前、后括住的单个字符被称为“字符常量字符常量”。比如,b、G、=、%、n、x41和110等,都是字符常量。若要得到反斜杠“”这个字符常量,在程序中应写成;要得到单引号“”这个字符常量,在程序中应写成。.C语言区分大小写,因此a和A是两个不同的字符常量。字符常量为字符(char)型数据,在内存需一个字节(8个二进制位)来存放该字符的ASCII码值(见附录2)。.ASCII码的数值范围是十进制的0128。若限制整常量的值在0128之间,那么从整常数的角度看,它是这个整常数的数值;从字符常数的角度看,它是某字符的ASCII码值。所以,在0128之
13、间,整常量和字符常量可以通用。.例例:编写一个程序,将整常量100按十进制和字符两种形式加以输出;将字符常量9按字符和十进制两种形式加以输出。#includestdio.hmain()printf(thedecimalformof100is%dn,100);printf(thecharacterformof100is%cn,100);printf(thecharacterformof9is%cn,9);printf(thedecimalformof9is%dn,9);o2.2.4 字符串常量字符串常量.在C语言中,用一对双引号前、后括住的零个或若干个字符,被称为“字符串常量字符串常量”,简称“
14、字符串字符串”。如acharacterstring、G、486和tNameAddressn等都是字符串。要注意,若双引号内没有何字符,即,称为“空字符串空字符串”。.一个字符串中所含的字符个数,称为该“字符串的长度字符串的长度”。字符串中若有转义字符,应把它视为一个字符来计算。.内存中存放字符串时,是存放串中每个字符的ASCII码值。各字符串所含字符数是不同的,因此在存放完字符串里的字符后,还要用一个字节存放一个ASCII码值为0的字符,以标识该字符串的结束。这个ASCII码值为0的字符,称为“空字符空字符”,程序中以转义字符“0”的形式来书写,它是字符串的“结束标记结束标记”。例例:解解:画
15、出字符串Thisisabook在内存中的存放形式。该字符串共14个字符,因此要分配给它15个字节,前14个字节存放14个字符对应的ASCII码值,最后一个字节存放字符串结束符“0”。图中,每一个字节里存放的数值,是该字符的十进制ASCII码值,下面列出的是ASCII码值对应的字符。84 1040105 115 32 105 115 32973298 111 111 107Thisisabook0空格符字符串结束符ASCII码值对应的字符0是视空字符(即NULL)为一个字符常量。在内存里用一个字节存放它的ASCII码值(十进制的0)。例例:在C语言中,a和a有什么区别?97970(或NULL)(
16、1)a是一个字符常量。在内存中,用一个字节存放a,存放字母a的ASCII码值(十进制的97)。(2)“a”是一个长度为1的字符串常量。在内存中,要用两个字节存放“a”,第一个字节存放字母a的ASCII码值(十进制的97),第二个字节存放字符串结束符“0”。内存中的字符a内存中的字符串”a”例例:在C语言中,1、1和1有什么区别?(1)(2)1是整型常量,在内存里要用两个字节来存放1的二进制数值。(3)1是字符常量,在内存里要用一个字节来存放字符1的ASCII码值(十进制的49)。“1”是长度为1的字符串常量,在内存里用两个字节来存放,第1个字节放字符1的ASCII码值(十进制的49),第2个字
17、节放字符串结束符“0”。000000000000000100000111000001110(或NULL)数值1在内存中的表示字符常量1在内存中的表示字符串常量”1”在内存中的表示在C语言中,0和0有什么区别?例例:(1)0是一个字符常量,在内存里将用一个字节存放它的ASCII码值(十进制的48)。(2)00000110字符常量0在内存中的表示00000000字符常量0在内存中的表示.在printf()函数里,用格式符“%s”可按原样输出字符串常量。o2.3.1 变量的数据类型变量的数据类型2.3 简简 单单 变变 量量1.程序执行过程中,允许其值发生变化的量,称为“变量变量”,通常用变量来保存
18、程序执行时的输入数据、中间结果以及最终结果等。.用户应为程序中用到的每个变量起名字,以示区别。为变量取的名字,称为“变变量名量名”。为变量起名应符合标识符的命名规则。在程序中说明一个变量时,完整做法是:给出变量的名字(以示区别),给出变量的数据类型(以决定所分配存储区的大小),给出变量的存储类型(以表明对存储区是长期占用还是临时使用),还可给出变量的值(初始化)。.程序中使用每个变量之前,必须先进行“变量说明变量说明”:起一个名字(变量名)并指定它的数据类型。变量说明语句的基本格式是:;.整型变量的说明整型变量的说明用数据类型符int,将一个变量说明为是整型的。比如:intx;传达的信息是有一
19、个名为x的整型变量,因此它要在内存占用2个字节来存放其值,取值范围是32768+32767。.signedint与unsignedint的区别在于对该数的(二进制)最高位的解释不同。前者是把最高位当作符号位看待,后者的最高位仍用于存储数据。若在说明一个整型变量时含有修饰符signed、unsigned、long或short等,那么int可以省略不写。即longinty;与longy;所说明的变量含义相同。.在整型变量说明符int的前面加上修饰符signed、unsigned、long或short后,就可以说明一个变量是带符号的、无符号的、长型的或短型的等等。对整型变量说明的几点注意.(1)(2
20、)int在前没有修饰符时,默认为是带符号的,即int就是signedint。(3)2.实型变量的说明实型变量的说明用数据类型符float或double,将一个变量说明为是单精度实型的或双精度实型的。比如:floatx;表示x是一个单精度实型变量,需要4个字节来存放值。比如:doublent;表示nt是一个双精度实型变量,需要8个字节来存放值。.3.字符型变量的说明字符型变量的说明用数据类型符char,将一个变量说明为是字符型的。比如:charch;表示说明变量ch是字符型的,要在内存中分配1个字节来存放它的ASCII码值。.在一个变量说明语句中,可以同时说明多个相同数据类型的变量。比如:int
21、a,b,c;说明了变量a、b和c都是整型的,它们每一个都需要2个内存字节来存放自己的取值。4.关于变量数据类型说明的几点注意关于变量数据类型说明的几点注意.任何变量都必须遵循“先说明后使用”的原则。只有说明了的变量,才能在程序中使用;若违反了“先说明后使用”的规则,程序就不会通过编译。.变量数据类型的说明可以放在一个程序所有函数的外面,也可以放在某个函数的里面。在函数里面说明的变量,必须将其集中安放在该函数的最前面。一个变量的说明是放在函数外或放在函数内,所起的作用是不相同的。.在同一个函数中说明多个变量时,其变量名不能相同。.在C语言中,只有字符串常量,没有字符串型的变量。o2.3.2 变量
22、的存储类型变量的存储类型一个变量被分配在静态存储区还是动态存储区,这将由变量的存储类型来决定。1.变量的存储类型变量的存储类型.系统分配给用户使用的三个内存存储区:应用程序区存放用户程序;静态存储区静态存储区存放程序执行全过程中都需保存的那些数据;动态存储区动态存储区存放程序执行时,临时需要保存的那些数据。.C语言的存储类型符存储类型自动型寄存器型静态型外部型存储类型符存储地点autoregisterstaticextern动态存储区CPU的通用寄存器静态存储区静态存储区.为说明一个变量的存储类型,只需在变量说明语句里添加存储类型符即可。这时的变量说明语句格式成为:;比如,有两个变量说明语句:
23、staticintx;autofloatz;表示要在内存的静态存储区为整型变量x分配2个字节的存储区;在内存的动态存储区为单精度实型变量z分配4个字节的存储区。.自动型变量自动型变量2.把存储类型符auto加在变量名及其类型前面,该变量就成为一个自动型变量,简称自动变量。C语言在动态存储区里为其分配存储区。.有关自动变量的几点注意(1)只能在函数内说明自动变量。如果一个变量是自动型的,那么保留字auto可以省略不写。正因为如此,前面所举例子中的变量,都属于自动型。(2)(3)在不同函数中说明的自动变量,可以使用相同的名字,它们的类型可以相同,也可以不同,彼此不会产生干扰。寄存器变量寄存器变量3
24、.数据放在寄存器里,操作起来比在内存里快。可通过保留字register,把一个变量说明为是寄存器型的,这样C的编译程序就会把该变量放在CPU的一个通用寄存器中参与操作。.有关寄存器变量的几点注意(1)只能在函数的内部说明寄存器型变量。(2)CPU中的通用寄存器数量有限,因此程序中不能同时说明多个寄存器型变量,一般以2个为宜。如果超出,编译程序会把它们设为自动型变量。(3)不能把long、float和double型的变量定为寄存器型的。(4)现在经过优化的编译程序,会判别使用频繁的变量,并把它们自动存放到寄存器中,而不需要程序设计者人为指定。因此,现实程序中极少使用寄存器型变量。静态型变量静态型
25、变量4.把存储类型符static加在变量名及其数据类型前面,就成为一个静态型变量,简称“静态变量”。C语言在静态存储区里为静态变量分配存储区。.静态变量可以在函数内部说明,也可以在函数外部说明。本书只涉及在函数内部说明的静态变量。有关静态变量的几点注意(1)(2)在整个程序运行期间,静态变量一直占据分配给它的存储区不予归还,直到程序运行结束。外部型变量外部型变量5.把存储类型符extern加在变量名及其数据类型前面,该变量就成为一个外部型变量,简称“外部变量”。C语言在静态存储区里为外部变量分配存储区。.C语言允许对源程序分别编译,然后再连接装配。因此会发生这样的情形:源程序乙要用到源程序甲中
26、的某个变量。为了向编译程序提供这方面的信息,源程序甲就应该把这个源程序乙要用到的变量的存储类型说明为是extern型的,表示允许别的源程序使用。.关于变量存储类型说明的几点注意关于变量存储类型说明的几点注意6.若多个变量有相同的存储类型和数据类型,那么可用一个语句做统一的说明。.通常,在变量说明语句中,总是在变量名前先写变量的存储类型符(如果写的话),再写变量的数据类型符。不过,存储类型符和数据类型符的书写顺序可以颠倒。对自动型和寄存器型变量,若在说明时进行了初始化,那每次运行到该变量所在函数时,都会再次被初始化;若在说明时没做初始化,那在执行到第一次赋予它值的语句之前,它的值是不确定的。只有
27、赋予它值后,才能参与运算。o2.3.3 变量的初始化与完整的变量说明语句变量的初始化与完整的变量说明语句.若在对变量说明的同时给变量赋予值,则称是“变量的初始化量的初始化”。一个完整的变量说明语句有如下的格式:=;例如:charch1=A,ch2=g,ch3=F;staticintfir_var=12;floatnum=14.56;在说明一个变量时,不一定非进行初始化。不过,对于不同存储类型的变量,在说明时进行或不进行初始化,其效果不尽相同。.(1)(2)对函数内的静态型变量,若在说明时进行了初始化,那该初始化只在第一次运行时进行,下次再运行到该变量所在函数时,不会重新初始化,而是继承上次运行
28、后保留的值参与这次运算;若说明时没进行初始化,那C会自动进行初始化:将整型变量赋予初值0,实型变量赋予初值0.0,字符型变量赋予初值空字符,下次再运行到该变量所在函数时,不会重新初始化,而是继承上次运行后保留的值参与这次运算。程序中说明了两个字符型变量c1和c2,并做了初始化。第1个printf()把c1、c2视为字符看待(%c),应输出字母a和e。第2个printf()把c1、c2视为数值看待(%d),应输出97和101。printf()里的“t”是转义字符,表示输出一个制表符(Tab)。所以程序执行后的输出结果为:ae97101例例:解解:阅读程序,给出输出结果。#includestdio
29、.hmain()charc1=97,c2=101;printf(%ct%cn,c1,c2);printf(%dt%dn,c1,c2);例例:编写一个程序,从键盘输入一个字符后,把该字符的ASCII码值加1,输出新字符。#includestdio.hmain()charch;scanf(%c,&ch);printf(%cn,ch+1);(1)程序实现(2)分析与讨论.字符数据以字符形式输出时,是先将其的ASCII码值转换成相应字符,然后输出;以整数形式输出时,就是直接将ASCII码值作为整型数输出。.在一定范围内字符型数据和整型数据间是通用的,所以可对字符型数据进行算术运算,即对其ASCII码值
30、做算术运算。程序中printf(“%cn”,ch+1)表示将键盘输入的字符(存在变量ch里)的ASCII码加1后以字符形式输出,因此是该字符后面的那个字符。比如,输入A(ASCII码为65),加1后就应该输出B(ASCII码为66)。#includestdio.hmain()intx=64;floaty=44.23;charch=K;intj=125;printf(thevalueofxis%d,theaddressofxis%un,x,&x);printf(thevalueofyis%f,theaddressofyis%un,y,&y);printf(theasciiofchis%d,the
31、addressofchis%un,ch,&ch);printf(thevalueofjis%d,theaddressofjis%un,j,&j);o2.3.4 变量地址与取地址符变量地址与取地址符“&”.在程序中说明一个变量后,内存就会有一个存储区与之对应。这个存储区的第1个字节的地址,就称为是该变量的“地址地址”。.C语言里,一个变量的地址要通过在变量前加“&”符号来得到,称“&”为“取地址符取地址符”。.变量的地址是一个无符号的数值。在printf()函数里如果把格式符换成“%u”,就可以把系统分给某个变量的地址打印出来。例例:编写一个程序,将分配给变量的地址打印出来。(1)程序实现(2)
32、分析与讨论654906549265497654986444.23751252.4 C语言的运算符与各种表达式语言的运算符与各种表达式.用来表示各种运算的符号称为“运算符运算符”。只需一个运算对象的运算符,称为“单目运算符单目运算符”;有的需两个,称为“双目运算符双目运算符”;最多需要3个,称为“三目三目运算符运算符”。.用运算符把运算对象连接在一起组成的式子,称为“表达式表达式”。每种表达式按照运算符的运算规则进行运算,最终都会得到一个结果,称为“表达式的值表达式的值”。.表达式中有多个运算符时,先做哪个运算,后做哪个运算,必须遵循一定的规则,这种运算符执行的先后顺序,称为“运算符的优先级运算
33、符的优先级”。圆括号能改变运算的执行顺序。.对于优先级相同的运算符,将由该运算符的结合性来决定它们的运算顺序。C语言中同级别运算符可以有两种结合性:所谓结合性是“自左向右自左向右”的,意即由左向右遇到谁就先做谁;所谓结合性是“自右向左自右向左”的,意即由右向左遇到谁就先做谁。学习C语言时,必须关注那些结合性为自右向左的运算符。o2.4.1 算术运算符与算术表达式算术运算符与算术表达式由算术运算符把数值型运算对象连接在一起,就构成了所谓的“算术表达式算术表达式”。.除法运算符:除法运算符:/该运算符的运算规则与运算对象的数据类型有关:若两个运算对象都是整型的,则结果是取商的整数部分,舍去小数(也
34、就是做整除);若两个运算对象中至少有一个是实型的,那么结果是实型的,即是一般的除法。1.该运算符的两个运算对象必须是整型的,结果是整除后的余数(即求余),符号与被除数相同。比如,14%5的结果是4;64%6的结果是4;13%3、13%3的结果都是1(商分别是4、4);13%3、13%3的结果都是1(商分别是4、4)。增1、减1运算符都是单目运算符,运算对象只能是变量,且变量的数据类型限于整型、字符型,以及以后要学习的指针型、整型数组元素等。分析如下程序的输出结果。例例:#includestdio.hmain()intx=26,y=8;floatf=26.0;printf(26/8=%dn,x/
35、y);printf(26.0/8=%fn,f/y);第1个printf()要打印输出x/y,即是求分数26/8的结果。由于这时分子和分母都是整数,所以执行的是整除,结果为3;第2个printf()要打印输出f/y。这时的分数是26.0/8,分子是实数,所以执行的是一般除法,结果为3.250000。注意:第2条printf()中的格式符是“%f”,而不是“%d”。解解:.模运算符:模运算符:%.2.增增1、减、减1运算符:运算符:+和和-3.增1、减1运算符的操作是自动将运算对象实行加1或减1,并把运算结果回存到运算对象中。所谓“回存”,是“仍然存放到运算对象的存储单元”的意思。.增1、减1运算
36、符它们既能出现在运算对象之前,比如:+i,-j,成为所谓的“前缀运算符前缀运算符”;也能出现在运算对象之后,比如:x+,y-,成为所谓的“后缀运算符后缀运算符”。.前缀式增1、减1运算符,是先对运算对象完成加、减1和回存操作,然后才去使用该运算对象的值;后缀式增1、减1运算符,是先使用该运算对象的值,然后才去完成加、减1和回存操作。#includestdio.hmain()inta=3,b=5;printf(a=%dn,+a);printf(a=%dn,a);printf(b=%dn,b-);printf(b=%dn,b);分析如下程序的输出结果。例例:第1条printf()是要把+a打印出来
37、。由于运算符+为前缀式的,所以在打印前(即使用a值之前),应先做对a加1和回存的操作,然后才打印,因此输出a=4。由于a里的内容已因回存而变为4,因此执行第2条printf()时,输出的也是a=4。第3条printf()是要把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应先完成+,然后再取负打印,所
38、以它输出9。.关于增1、减1运算符的几点注意(1)+和-只能作用在变量上,而不能用于常量和表达式。(2)+和-组成了两个新的运算符,不是通常意义的两个加号或两个减号。因此在录入源程序时,不能在+或-中间插入空格。在表达式中遇到连续多个加号或减号情形时,C语言规定从左向右尽可能多地将若干个加号或减号组成一个运算符。比如:i+j将理解为是(i+)+j,而不是i+(+j)。(3)分析如下程序的输出结果。例例:(1)#includestdio.hmain()inta=8;printf(%dt,-+a);printf(%dn,a);printf(%dt,-a+);printf(%dn,a);(2)由于前
39、面对a做了+,所以a的内容变为9。因此第2条printf()仍应输出9。(3)第3条printf()应理解为是(a+)。这时+在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”。后者是错误的。算术自反赋值运算符的作用是把“运算”和“赋值”两个动作结合起
40、来,成为一个复合运算符。这组算术自反赋值运算符都是双目运算符。由于本质上它们都是进行赋值,所以运算符左边必须是变量,右边是表达式。.算术自反赋值运算符:算术自反赋值运算符:+=、=、*=、/=和和%=2.以“+=”为例,其形式为:+=含义是先把运算符左边变量的当前值与右边表达式的值进行“+”运算,然后把结果赋给左边的变量。即:x+=2等价于x=x+2。因此这些表达式也称为“赋值表达式”。例例:有变量说明:intx=8,y=8,z=8;。执行语句x=yz;后,x、y、z的值各多少?解解:该语句等同于x=x(yz);,即是x=xy+z;。按x,y,z的值计算右边表达式,求得结果为5。将其赋给左边的
41、变量x。于是x取值5。由于语句x=yz;,只改变x的值,变量y,z的取值不受影响。所以最终3个变量的值为:x=5,y=8,z=8。.关于算术自反运算符的几点注意(1)(2)由于运算符“%”本身的限制,算术自反运算符“%=”也只能用于整型数据,即它左边变量的当前值应该是整型的,右边表达式的值也应该是整型的。C语言里的赋值运算符虽然形同数学中的等号,但它已完全丧失了“等于”的原义,这是必须注意的。在C语言里把“x=5;”读作“把数值5赋予变量x”,不能读作“x等于5”。程序中说明变量x时没初始化。随后的“x=56.57;”是一条赋值语句,它把右边的数值56.57存入变量x的单元中。所以printf
42、()将输出x=56.570000。o2.4.2 赋值运算符与赋值表达式赋值运算符与赋值表达式.基本赋值运算符:基本赋值运算符:=1.基本赋值运算符简称“赋值运算符赋值运算符”。赋值运算符是双目运算符,使用时左边必须是变量,右边是表达式,即具有形式:=.赋值运算符的含义是先计算赋值号“=”右边表达式的值,然后把结果赋给(即存入)左边的变量。这样的式子称为“赋值表达式赋值表达式”。.在赋值表达式的后面加上语句结束符分号,就成为一个“赋值语句赋值语句”。它是C语言程序中使用得最为频繁的语句。分析如下程序的输出结果。例例:(1)#includestdio.hmain()floatx;x=56.57;p
43、rintf(x=%fn,x);(2)程序中变量a和b说明时初始化为3和5,x、y、z是由赋值语句得到值的。o2.4.3 关系运算符与关系表达式关系运算符与关系表达式.所有关系运算符都是双目的。用关系运算符将两个运算对象连接起来所形成的表达式,称为“关系表达式关系表达式”。.关系运算符的作用是比较左、右两个运算对象,测试它们之间是否具有所要求的关系。关系表达式的最终结果是逻辑值逻辑值:如果关系成立,则表达式取逻辑值“真真”,用数值1表示;如果关系不成立,则表达式取逻辑值“假假”,用数值0表示。关系表达式中的运算对象可以是数值型的,也可以是字符型的。若是字符型的,则是按照它们的ASCII码值来进行
44、比较。.要特别区分符号“=”和符号“=”。前者是关系运算符,表示检验左右两个量之间是否具有“等于、相等”的关系;后者是赋值运算符,表示把右边的表达式值赋给(或存入)左边的变量。试分析下面的程序输出。例例:#includestdio.hmain()inta=3,b=5,x,y,z;x=ab;y=ab和a=b不成立,关系ab|a!=b”的结果为真。这是因为虽然关系表达式:ab不成立,但是关系表达式a!=b却成立。用关系运算符只能形成简单的比较条件。要把多个简单的条件组合成复杂的条件,就必须利用逻辑运算符。通过逻辑运算符组成复杂的条件通过逻辑运算符组成复杂的条件4.要表示“x大于a小于b”的数学关系
45、“axa&xb的值赋给变量n的操作。即变量n仍保持它原有的值10。变量m、n、a、b的初值都是10。赋值语句:x=(m=ab)&(n=ab);是把表达式(m=ab)&(n=ab)的值赋给变量x。&左右两边也都是赋值表达式:左边把表达式ab的值赋给变量m;右边把表达式ab的值赋给变量n。对于&运算符,只要左边的运算对象为假,则整个表达式肯定取值“假”(数值0),C编译程序不再不再对右边的运算对象进行求值。参加逻辑运算时,用非非0值表示逻辑真值表示逻辑真,用值1表示运算结果的逻辑表示运算结果的逻辑真真。参加逻辑运算时,都以数值数值0表示逻辑假表示逻辑假。关于逻辑运算符的几点注意.(1)(2)(3)
46、对于|运算符,只要左边的运算对象为真,则整个表达式肯定取值“真”(数值1),C编译程序不再不再对右边的运算对象进行求值。试分析下面的程序输出。例例:(1)#includestdio.hmain()intx,m,n,a,b;m=n=a=b=10;x=(m=ab)&(n=ab);printf(x=%d,m=%d,n=%dn,x,m,n);输出结果应该是:x=0,m=0,n=10(2)(3)计算该表达式值时,左边的关系表达式ab不成立,因此变量m的值为0。既然&左边的条件已取值假,于是C语言就不程序要求用户在键盘上输入一个整型数,存放到变量x。然后把条件表达式(x%2=0)?0:1的值赋给变量y。o
47、2.4.5 条件运算符与条件表达式条件运算符与条件表达式在C语言里,由“?”和“:”两个符号组合成为条件运算符,是C语言里唯一的一个三目运算符。一般形式为:?:其中,是一个逻辑表达式,和的类型必须相同。由此而构成的整个表达式,称为“条件表达式条件表达式”。.该运算符的含义是先计算的值。若值为真,则整个条件表达式以的值作为自己的值;若其值为假,则整个条件表达式以的值作为自己的值。试分析下面程序的功能。例例:(1)#includestdio.hmain()intx,y;scanf(%d,&x);y=(x%2=0)?0:1;printf(x=%d,y=%dn,x,y);(2)只当x是偶数时,x%2的
48、余数才为0,即“x%2=0”才成立。所以该条件表达式的含义是:若输入的是偶数,那就把0赋给变量y;否则,就把值1赋给变量y。编写程序,从键盘输入字符。如果字符是英文小写字母,则将其转换成大写后输出,否则输出原字符。例例:#includestdio.hmain()charx;printf(Enteracaracter!);scanf(%c,&x);(x=a&x=a&x=97&x=A&x=65&x=a&x=z)?printf(%cn,xa+A):printf(%cn,x)赋值表达式y=(x+4,x+10)的右边是一个逗号表达式。该表达式的值是最右边表达式x+10的值。因此是把20赋给变量y。o2.
49、4.6 逗号运算符与逗号表达式逗号运算符与逗号表达式.所谓“逗号运算符逗号运算符”,就是把逗号(,)作为运算符,把若干个表达式连接在一起。这样构成的表达式的整体,称为“逗号表达式逗号表达式”。逗号表达式的一般形式为:,.逗号表达式的执行过程是:从左到右顺序计算诸表达式的值,并把最右边的值作为整个表达式的最终取值。例例:(1)执行下面程序后,输出的结果是什么?main()intx=10,y;y=(x+4,x+10);printf(x=%d,y=%dn,x,y);(2)输出的结果是:x=10,y=20(3)注意:这里圆括号不能去掉。如果去掉圆括号,语句:y=(x+4,x+10);就成为语句:y=x
50、+4,x+10;。整个语句由逗号表达式组成:第1个表达式是赋值语句:y=x+4;第2个表达式是x+10。计算第1个表达式,使变量y取值为14;第2个表达式的值20是整个逗号表达式的值,但不会把这个值赋给变量y。因此,程序的输出结果成为:x=10,y=14o2.4.7 位运算符位运算符.所谓“位运算”,即是按照二进制位对整个运算对象进行操作,而不是只操作其中的某一个二进制位。无论是哪种位运算符,运算对象都只能是整型(包括字符型)的,运算的结果仍然是整型的。位位逻辑运算符逻辑运算符1.名称运算符运算对象个数含义位非单目位1为0,位0为1位与&双目相应位都为1时,才是1位或|双目相应位中只要有一个为