清华大学C语言谭浩强第2章.ppt_第1页
清华大学C语言谭浩强第2章.ppt_第2页
清华大学C语言谭浩强第2章.ppt_第3页
清华大学C语言谭浩强第2章.ppt_第4页
清华大学C语言谭浩强第2章.ppt_第5页
已阅读5页,还剩125页未读 继续免费阅读

下载本文档

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

文档简介

1、第2章基本数据类型和运算,第2章 C语言的基本知识,2.1 C语言的数据类型 2.2 常量及其类型 2.3 变量及其类型 2.4 运算符与表达式 2.5 不同数据类型的输入 2.6 不同数据类型的输出,2.1 C语言的数据类型,2.1.1 C语言具有的数据类型 2.1.2 C 语言的基本数据类型 2.1.3 基本数据类型的修饰,2.1.1 C语言具有的数据类型,数据类型是指数据的内在表现形式。不同的数据类型在内存中的存储方式不同,在内存中所占的字节数也不相同。 通俗地说,数据在加工计算中的特征就是数据类型。 例如,职工的年龄和工资都可以进行加减等算术运算,具有一般数值的特点,在C语言中称为数值

2、型。其中年龄是整数,所以称为整型;工资一般为实数,所以称为实型。,C语言的数据类型有以下几种,如图2-1所示。,图2-1 C语言的数据类型,2.1.2 C 语言的基本数据类型,基本数据类型是不可再分的最基本的数据类型,是构造其他数据类型的基础。 C语言提供的五种基本的数据类型及其对应的关键字如表2-1所示。 字符型用来描述单个的字符;整型用来描述整数;浮点型和双精度型用来描述实数,其中双精度型比浮点型表示的精度高;无值类型用来描述无形式参数的C函数、无返回值的C函数或无定向指针等。,表2-1 C语言基本的数据类型及其对应的关键字,C语言规定,可以在基本数据类型关键字前面加上类型修饰符“sign

3、ed、unsigned、short、long”,从而扩展基本数据类型的数值范围或提高基本数据类型的精度。 Turbo C 编译系统中的基本数据类型修饰有如下的规定: (1)char型数据可以用signed、unsigned加以修饰,即可以有char、signed char、unsigned char 三种形式。,2.1.3 基本数据类型的修饰,(2)int 型数据可以用signed、unsigned、short、long加以修饰,即可以有int、signed int、unsigned int、short int、long int、signed long int 、unsigned long i

4、nt等形式。对于int而言,当使用类型修饰后,关键字int可省略不写,例如signed long int可以写成long,unsigned long int可以写成unsigned long。 (3)C语言的ANSI C标准指出:各种变量的取值范围应在标题文件limits.h和float.h中作出定义。,2.2 常量及其类型,2.2.1 整型常量 2.2.2 实型常量 2.2.3 字符型常量 2.2.4 字符串常量 2.2.5 符号常量,2.2.1 整型常量,1. 十进制整数 2. 八进制整数 3. 十六进制整数,十进制是整数的通常写法,十进制整数没有前缀,其数码为09。 例如:437 八进制

5、整数必须以数字0开头,即以0作为八进制数的前缀。数码取值范围为07。 例如:0123 十六进制整常数的前缀为0X或0 x。其数码为09,AF或af。 例如:0 x123,2.2.2 实型常量,1. 小数形式 2. 指数形式,1. 小数形式,由正负号、整数部分、十进制小数点和小数部分组成。整数部分和小数部分是由数字09和小数点组成,其中小数点是不能缺少的。,2. 指数形式,在小数的基础上,后面加阶码标志(“e”或“E”)以及阶码组成。其一般形式为: a E n或 a e n 其中的a为十进制数,E或e为阶码标志,n为十进制整数。需要注意的是,字母“e”或“E”之前必须有数字,且e后面的指数必须为

6、整数,如e5、3.24e3.2、e等都是不合法的指数形式。,例2.1以实数的形式输出三个数。 main() printf(%fn ,365.); printf(%fn ,365); printf(%fn ,365f); 该程序的运行结果如下:,从输出结果可以看出第二行输出的0.000000不是期望的数值。原因是实数不仅要有数字部分,而且还要有小数点,否则,C程序运行结果将不是期望值。,365.000000 0.000000 365.000000,2.2.3 字符型常量,1. 单引号表示法 2. 转义字符表示法,1. 单引号表示法,对于可显示的字符常量,可直接用单引号将该字符括起来,如 a 、

7、9 、 Z 、 = 、 + 、 ? 等。也可用字符的ASCII码值表示字符,如十进制的85表示大写字母 U ,八进制数0102表示大写字母 B 。,2. 转义字符表示法,对于不能显示的字符(主要指控制字符,如回车符、换行符、制表符等)和一些在C语言中有特殊含义和用途的字符(如单引号、双引号、反斜杠线等),只能用转义字符表示。 转义字符是一种特殊的字符常量。转义字符以反斜线“”开头,后面跟一个或几个字符。转义字符具有特定的含义,它不同于字符原有的意义,所以称“转义”字符。常用的转义字符及其含义如表2-3所示。,表2-3 常用的转义字符及其含义,说明:语言字符集中的任何一个字符均可用转义字符来表示

8、。表中的ddd和xhh正是为此而提出的。ddd和hh分别为八进制和十六进制的ASCII代码。如101表示字母“A” ,102表示字母“B”,X0A表示换行等。 字符常量的特点: (1)字符常量只能用单引号括起来,不能用双引号或其他符号。 (2)字符常量只能是单个字符,不能是字符串。 (3)字符常量可以是字符集中任意字符。 (4)C语言对字符型和整型是不加区分的,字符型常量被视为1字节的整数,其值就是该字符的ASCII码,可以像整数一样参加数值运算。例如,C的ASCII码为67,C-2的值为65,即字符A的ASCII码。,2.2.4 字符串常量,字符串常量是用双引号括起来的零个或多个字符序列。

9、例如:”,”Gold human!”,”010278” 等都是字符串常量。 其中,两个双引号连写表示空字符串;当字符串中包含像单引号、双引号或反斜杠线这类有特定用途的字符时,应该分别用转义字符、”、表示。 例如,”He said:”hello!” 代表的英文句子是: He said:”hello!”,一个字符串中所有字符的个数称为该字符串的长度,其中每个转义字符只当做一个字符。例如,”1234567”,”xyz”, ”BbedsQd”,”ABCD”,”101102 x43x44”的长度分别为7、3、7、6、4。 C语言规定,每个字符串在内存中占用的字节数等于字符串的长度加1。其中最后一个字节存

10、放的字符称为“空字符”,其ASCII码为0,书写时常用转义字符0来表示,是字符串结束的标记。 例如字符串”MN”和”M”的长度分别为2和1,它们在内存中分别占用3个字节和2个字节。,字符串常量和字符常量是两个不同的量,它们之间的主要区别有以下几点: (1)字符常量由单引号括起来,字符串常量由双引号括起来。 (2)字符常量只能是单个字符,字符串常量则可以含一个或多个字符。 (3)可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在语言中没有相应的字符串变量,但是可以用一个字符数组来存放一个字符串常量(详见第4章的介绍)。 (4)字符常量占一个字节的内存空间。字符串常量占

11、的内存字节数等于字符串中字节数加1。增加的一个字节用来存放字符串结束的标志0(ASCII码为0)。,2.2.5 符号常量,1.符号常量的定义 2.符号常量的优点,1.符号常量的定义,符号常量是用标识符表示的常量。 定义符号常量有三种方法: 宏定义 const修饰符 枚举 这里先介绍前两种,第三种在第7章介绍。,1)宏定义,宏定义是用指定的标识符来代表一串字符,其一般形式为: #define 标识符 字符串 例如:#define PI 3.14159265,2)const定义,const定义的符号常量既有类型又有值,与宏定义不同,其一般的形式为: const 数据类型 标识符=常量表达式; 例如

12、: const int max=300; const float x=max+3.14;,2.符号常量的优点,符号常量具有以下优点: (1)用符号常量可以清晰地看出常量所代表的物理意义。 (2)如果一个程序中多次出现某一个常量(例如,3.14159265),就要多次书写,使用符号常量就可以较短的符号代替较长的数字,从而可以有效地避免多次书写同一个常量,并减少出错的几率。 (3)当程序中多次出现同一个常量需要修改时,必须逐个修改,很可能漏改或错改。用符号常量只需修改定义,就可以做到统改,减少出错的几率。,2.3 变量及其类型,2.3.1 变量及其定义 2.3.2 整型变量 2.3.3 实型变量

13、2.3.4 字符型变量 2.3.5. 字符串变量,2.3.1 变量及其定义,变量是指在程序运行过程中其值可以发生变化的量。 一般情况下,变量用来保存程序运行过程中输入的数据、计算获得的中间结果以及程序的最终结果。 变量的定义格式为: 类型说明符 变量名表; 其中,类型说明符包括int、float、double、char等,用来指定变量的数据类型;变量名表如果有多个变量,则彼此间要用逗号分隔开;分号是语句结束符。,例如: int x; /*定义了一个类型为整型的变量x*/ int y, z; /*定义了一个整型变量y和一个整型变量z*/ float a,b,c; /*定义了三个浮点型变量a、b、

14、c*/ 在变量定义时,应注意以下几点: (1)允许在一个类型说明符后,定义多个相同类型的变量。各变量名之间用逗号间隔。 (2)类型说明符与变量名之间至少用一个空格间隔。 (3)变量定义必须放在变量使用之前。一般放在函数体的开头部分。 (4)最后一个变量名之后必须以分号“;”结尾。,2.3.2 整型变量,整型变量的基本类型符为int。可以根据数值的范围将整型变量定义为基本整型、短整型、长整型、无符号型,具体如下所述: (1)基本整型:类型说明符为int,在内存中占2个字节。 (2)短整型:类型说明符为short int或short,所占字节和取值范围均与基本型相同。 (3)长整型:类型说明符为l

15、ong int或long,在内存中占4个字节。,(4)无符号型:类型说明符为unsigned。其中,无符号型又可与上述三种类型匹配而构成如下类型: 无符号基本型:类型说明符为unsigned int或unsigned。 无符号短整型:类型说明符为unsigned short。 无符号长整型:类型说明符为unsigned long。 说明:各种无符号类型的量所占的内存空间字节数与相应的有符号类型的量相同。但由于省去了符号位,所以不能表示负数。有符号整型变量的最大取值为32767,而无符号整型变量的最大取值为65535。,表2-4 各类整型变量所分配的内存字节数及数的表示范围,表2-4列出了C语言

16、中各类整型变量所分配的内存字节数及数的表示范围。,例2.2整型变量的定义与使用举例一。 #include main() int x,y,m,n; /* 指定x,y,m,n 为整型变量 */ unsigned u; /* 指定u 为无符号整型变量 */ x=-21; y=18; u=40; m=x+u; n=y+u; printf(x+u=%d,y+u=%dn,m,n); ,程序的运行结果为:x+u=19,y+u=58,例2.3整型变量的定义与使用举例二。 #include main() int a,b,c,d; /*定义整型变量a、b、c、d*/ long x,y; /*定义长整型变量x、y*

17、/ x=7; /*变量赋初值*/ y=8; a=9; b=10; c=x+a; /*求x与a的加和*/ d=y+b; /*求y与b的加和*/ printf(c=x+a=%d,d=y+b=%dn,c,d); /*输出c、d的值*/ ,程序的输出结果为: c=x+a=16, d=y+b=18,C语言中,可以在程序的一行中写入多条语句,因此上面的程序可以调整为: main() int a,b,c,d; long x,y; x=7; y=8; a=9; b=10; c=x+a; d=y+b; printf(c=x+a=%d,d=y+b=%dn,c,d); ,调整后的程序只是其表示形式发生了变化, 程序

18、的本质并没有改变,该程序的运行结 果为: c=x+a=16, d=y+b=18,2.3.3 实型变量,在C语言中,实型变量分为单精度、双精度两类 。 单精度型:类型说明符为float。 双精度型:类型说明符为double。 在一般系统中一个float型的数据占4个字节(32位)内存空间,一个double型的数据占8个字节(64位)内存空间。单精度实数提供7位有效数字,双精度实数提供1516位有效数字,数值的取值范围随机器系统而异。 每一个实型变量都应在使用前进行定义。例如: float m,n; /*定义两个单精度实型变量x和y */ double a,b,c;/*指定a、b、c为双精度实型量

19、*/,例2.4实型变量的定义和应用举例。 #include main() float a; double b; a=5555.55555; b=5555.5555555555; printf(%fn%fn,a,b); ,该程序的运行结果如下: 5555.555664 5555.555556,说明:实型常量不分float型和double型。一个实型常量可以赋给一个float型或double型变量。根据变量的类型截取实型常量中相应的有效位数字。,2.3.4 字符型变量,字符型变量用来存放字符常量,一个字符型变量只能存放一个字符。 字符变量的类型说明符是char。 下面是几个字符型变量的定义: ch

20、ar m1,m2,m3; 上述语句将m1、m2和m3定义为字符型变量,其内可以各放一个字符,下面给这三个字符变量分别赋值a、b、c: m1=a; m2=b; m3=c;,例2.5字符型变量的定义与使用举例。 #include main() char c1,c2; c1=97;c2=98; /*97和98分别为字符A和B的ASCII码*/ printf(%c %c ,c1,c2); printf(%d %dn,c1,c2); /*小写字母的ASCII码值比对应的大写字母大32*/ c1=c1-32; c2=c2-(a-A); printf(%c %cn,c1,c2); ,程序的运行结果为: a

21、b 97 98 A B,分析:这里的97和98是字符A和B的ASCII码值,程序执行时C语言把97和98按照输出语句中格式控制符的规定转化成了其对应的字符。 说明:字符型数据和整型数据是通用的。它们既可以用字符形式输出,也可以用整数形式输出。但是应注意字符数据只占一个字节,只能存放0255范围内的整数。,2.3.5 字符串变量,C语言没有专门的字符串变量,可以用字符数组来实现,详见第4章的介绍。,2.4 运算符与表达式,2.4.1 运算符及运算对象 2.4.2 表达式 2.4.3 算术运算符 2.4.4 关系运算符 2.4.5 逻辑运算符 2.4.6 逗号运算符和条件运算符 2.4.7 长度(

22、求字节)运算符 2.4.8 位操作 2.4.9 赋值运算符 2.4.10 数据之间的混合运算,2.4.1 运算符及运算对象,1.运算符 2.运算对象,用来表示各种运算的符号称为运算符,也称为操作符。C语言中运算符的分类如图2-3 所示。,1.运算符,2.运算对象,运算对象也称为操作数,C语言中的运算对象有下列三种情况: (1)运算符的运算对象可以是一个,此时的运算符称为“单目运算符”。 (2)运算对象最常见的是有两个,此时参与运算的运算符称为“双目运算符”。 (3)运算对象还可以是三个,称“三目运算符”。三目运算符在C语言中只能是条件运算符,夹在三个运算对象之间。 例如:ab?4:5,2.4.

23、2 表达式,1.表达式的定义 2.表达式语句,1.表达式的定义,表达式是用运算符与圆括号将操作数(运算对象)连接起来所构成的式子。 C语言的操作数包括常量、变量、函数值等。 例如,表达式sin(2.0)+(a-b)*5/sqrt(2.0)中包括的运算符有+、-、*、/,操作数包括常量5,变量a、b以及函数sin(2.0)和sqrt(2.0)。 表达式按照运算符的运算规则进行运算可以获得一个值,称为“表达式的值”。 当表达式中出现多个运算符时,表达式的计算按照教材中附录一中规定的运算符的优先级和结合性进行。,2.表达式语句,C语言中,在一个表达式的后面加上分号“;”就构成了表达式语句,即简单语句

24、。 有的表达式语句是有意义的简单语句。 例如:x=x+1;和x+;都表示使x单元的内容加1。 而有的表达式语句是无意义的。 例如:3+; 是无意义的表达式语句,因为这条语句没有引起任何存储单元中数据的变化。,2.4.3 算数运算符,1. 基本算术运算符 2. 自增、自减运算符 3. 算术表达式 4. 算术运算符的结合性和优先级,1.基本算数运算符,(1)加法运算符“+”:加法运算符为双目运算符,即应有两个操作数参与加法运算。如a+b,5+4等。但“+”也可作正值运算符,此时为单目运算,如+5等。 (2)减法运算符“-”:减法运算符为双目运算符。但“-”也可作负值运算符,此时为单目运算,如-5等

25、。 (3)乘法运算符“*”:乘法运算符为双目运算符,如8*9。但“*”在指针运算中,也可以表示单目的“取内容”运算。 (4)除法运算符“/”:除法运算符为双目运算符。参与的操作数均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为实型。 (5)求余运算符“%”:求余运算符也叫求模运算,为双目运算符,用来求两个整数的(int 型或char型)的余数,如9%2=1。,基本算术运算符的运算对象、运算规则与结合性如表2-5所示。,表2-5基本算术运算符的运算对象、运算规则与结合性,说明:两个整数相除结果也为整数,如3/2的结果值为1,舍去小数部分。但是,如果除数或被除数中有一个为负值

26、时,则舍去的方法不一定相同,例如-3/2在有的机器上得到的结果是-1,而有的机器则得出其他的值如-2。但多数机器采取“向零取整”的方法,也就是哪个值靠近0,取哪个值。 例2.6 运算符“/”应用举例。 #include main() printf(%d,%dn,30/8,-30/8); printf(%f,%fn,30.0/8,-30.0/8); ,程序的运行结果为: 3,-3 3.750000,-3.750000,2.自增、自减运算符,自增自减运算符都是单目运算符,用来对整型、字符型、指针型以及数组元素等变量进行算术运算,其运算结果与原来的类型相同,并存回原来的运算对象。 例如: (1)+m

27、:先使m的值加1,再使用变量m。 (2)m+:先使用m的值,再使变量m加1。 (3)-m:先使m的值减1,再使用变量m。 (4)m-:先使用m的值,再使变量m减1。,在理解和使用上容易出错的是:m+和m-。特别是当它们出现在较复杂的表达式或语句中时,常常难于弄清,所以在开始学习时一定应仔细分析。 例如:设整型变量m为4,则: +m+1:在计算时,先计算m= m+1=5后,再使用m的值5和1进行相加;结果为6。 m-+1:应理解为先进行m+1得出结果5,再进行m= m-1=3。 当出现难以区分的若干个+或-组成的表达式运算时,C语言规定,自左向右取尽可能多的符号组成运算符。 例如:设整型变量m和

28、n的值均为6,则: m+n:应理解为(m +)+n,最后的计算结果为12,m的值为7,n不变。 m-n:则理解为(m-)-n,最后的计算结果为0,m的值为5,n不变。,自增和自减运算符只能用于变量,而不能把它强加给常量和表达式,例如:8+、(m+n)-都是不合法的表示方法。自增和自减的结合方向是自右向左的。 例2.7自增自减运算符应用举例。 #include main() int y=6; printf(%dn,+y); printf(%dn,-y); printf(%dn,y+); printf(%dn,y-); printf(%dn,-y+); printf(%dn,-y-); ,程序的输

29、出结果为: 7 6 6 7 -6 -7,例2.8由自增运算符构成的表达式应用举例。 #include main() int x=8,y=8,p,q; p=(x+)+(x+)+(x+); q=(+y)+(+y)+(+y); printf(%d,%d,%d,%d,p,q,x,y); 分析:在本程序中,对p=(x+)+(x+)+(x+);应理解为三个x相加,所以p的值为24。然后x再自增1三次相当于加3,所以x的最后值为11。对q=(+y)+(+y)+(+y;应理解为q先自增1,再参与运算,由于q自增1三次后值为11,三个11相加的和为33,y的最后值仍为11。,程序的输出结果为: 24,33,11

30、,11,3.算术表达式,算术表达式是用算术运算符连接数值型的运算对象构成的表达式,用来完成数值计算的功能。如5%6+12,(3+5)/(6%4),(a+)*j-(+b)等。 使用算术运算符时,应注意以下几点: (1)乘法运算符“*”在表达式中既不能省略,也不能用“”或“”代替;除法运算符也不能用“”代替。 (2)C语言没有乘方运算,当需要进行乘方运算时,可以通过连乘的方式实现乘方运算,也可以使用C编译系统提供的数学函数,如:pow(10,n)表示10的n次方,pow(x,y)表示x的y次方。,(3)表达式中不允许使用方括号或花括号,但允许使用多重圆括号嵌套配对使用。如x/(12*(a+b)。

31、(4)算术表达式应能正确地表达数学公式。例如:数学表达式(4+y)/2b对应的C语言算术表达式为:(4+y)/(2*b)或(4+y)/2/b。 (5)算术表达式的结果应该不超过其所能表示的数的范围。例如,最大的整数是32767,则32767+12就是错误的结果。,4.算术运算符的结合性和优先级,运算符的结合性是指如果一个操作数左边和右边的两个运算符的优先级相同,应该优先计算的操作符。 计算机在进行表达式的计算时,通常严格按照运算符的优先级和结合性进行,就算术表达式而言,括号最优先,其次是一元运算符,然后是乘、除和求模,最后是加、减;当同一优先级的运算符同时出现时,按它们的结合性确定其优先次序。

32、详见附录一。,2.4.4 关系运算符,1. 关系运算符 2. 关系运算符的优先次序 3. 关系表达式,1. 关系运算符,所谓“关系运算”实际上是“比较运算”,首先将两个值进行比较,然后判断其比较的结果是否符合给定的条件。 例如:m8是一个简单的关系表达式,小于号()是其中的关系运算符,如果m的值小于8,则满足给定的条件,因此关系表达式的值为“真”;如果m的值等于或大于8,则其值为“假”。 说明:关系运算符可以用来比较两个数值型数据的大小,也可以比较两个字符数据的大小,字符数据的比较按该字符对应的ASCII代码值的大小进行,其实质也是数值比较。,关系运算符的运算对象、运算规则和结合性如表2-6所

33、示。,表2-6关系运算符的运算对象、运算规则和结合性,2. 关系运算符的优先次序,在语言中所有关系运算符优先级别如表2-7所示。,表2-7关系运算符优先级别,3.关系表达式,用关系运算符将两个表达式连接起来的式子称为关系表达式。其中,表达式可以是算术表达式或关系表达式,也可以是随后将要学习到的逻辑表达式和字符表达式。例如,c-da+b和x5/2均是合法的关系表达式。 由于关系表达式中的表达式也可以又是关系表达式。因此,C语言也允许出现嵌套的情况。例如:a!=(c=d) 关系表达式的值是一个逻辑值,即“真”或“假”,分别用“1”和“0”表示。如(a=3)(b=5),由于35不成立,故其值为0。,

34、例2.9关系表达式应用举例。 #include main() char c=k; int i=4,j=2,k=5; float x=3e+5,y=7.56; printf(%d,%dn,a+3=k+1); printf(%d,%dn,j6,x-4.85=x+y); printf(%d,%dn,i+j+k=-3*j,k=j=i+7); ,程序的运行结果为: 1,0 1,10,0,例2.10 几个学习怎样使用关系运算符的例子。 设变量定义如下: char a1=a,a2=A; /*a1、a2可以看成整型,其值分别为97、65*/ int n1=65,n2=97; float f1=0.3E1,f2

35、=3.0001; 则: a1a2、n1=n1、a2=n2、f1=n1、a1=n2的值依次是1、0、0、1。 f1a1、f2a2、f1=n1-62的值分别为0、1、1。,2.4.5 逻辑运算符,1.逻辑运算符及其运算规则 2.逻辑运算符的优先级和结合性 3.逻辑表达式,1.逻辑运算符及其运算规则,C语言中的逻辑运算符对两个关系式或逻辑值进行运算,共有三个运算符:逻辑与然后整个逗号表达式的值为9。,2.条件运算符,条件运算符的语法格式为: 表达式1?表达式2:表达式3 上述由条件运算符构成的表达式称为条件表达式,其执行过程如图2-4所示。,分析:在图2-3中,先求解表达式1的值,若为真(非0)则求

36、表达式2,此时表达式2的值就作为整个条件表达式的值。如果表达式1的值为假(0),则求解表达式3的值,表达式3的值就是整个表达式的值。 条件表达式通常用于赋值语句之中。例如条件语句(详见教材的第3章): if(mn)min=m; else min=n; 用条件表达式可写为: min=(mn)?m:n; 该语句的语义是:如果mn为真,则把m赋予min,如果mn为假,则把n 赋予min。,例2.12条件运算符应用举例。 #include main() int m,n,max; printf(nPlease input two numbers:); scanf(%d,%d, ,程序的运行情况为(用代表

37、回车符): Please input two numbers: 45,690 max=690,2.4.7长度(求字节)运算符,长度运算符sizeof是一种单目运算符,用来求某一类型变量的长度。其运算对象可以是任何数据类型符或变量。其语法格式为: sizeof(表达式) 其中的表达式可以是变量名、常量以及数据类型名。 其功能是:求表达式中变量名所代表的存储单元所占的字节数;或求表达式中常量的存储单元所占的字节数;或是求表达式中的数据类型表示的数据在内存单元中所占的字节数。,说明:对于不同的机型,相同的数据类型可能占不同长度的内存空间,使用sizeof运算符就可以了解自己所用的机型所有数据类型所占

38、的存储空间。sizeof运算符使用上较灵活,例如求整型int数据所占的字节数,可以使用以下三种方法: (1)求sizeof(int)。 (2)求sizeof(100)。 (3)使用int a;定义一个整型变量a,求sizeof(a)。,2.4.8 赋值运算符,所谓赋值是将一个数据值存储到一个变量中,其中赋值的对象必须是变量,但数据值可以是常量、变量或具有确定值的表达式。C语言中在赋值表达式的末尾加上分号就是赋值语句。 赋值表达式的格式为: 变量名=表达式 其中“=”称为赋值号或赋值运算符,赋值表达式的功能是计算“=”右边表达式的值并存入“=”左边的变量中。 C语言提供两种赋值运算符:简单赋值运

39、算符和复合赋值运算符。,1.简单赋值运算符,简单赋值运算符“=”是一种二元运算符,必须连接两个运算量,其左边只能是变量或数组元素(详见第4章),右边可以是任何表达式。 例如:a=a+1,b=a+c等是正确的赋值表达式。 而2=c,a+2=1等则是错误的赋值表达式。,2.复合赋值运算符,复合赋值运算符由简单赋值运算符“=”和另外一个二元运算符组成,具有计算和赋值双重功能,共有10种,分别是: +=、-=、*=、/=、%=、 (long)y表示将y转换成长整型参与运算。 注意:强自转化并不改变操作对象的数据类型和数值,例如(float)x确切的含义将x转换成浮点型参与运算,而x本身的数据类型和数值

40、并没有任何改变。,例2.15高精度整数转换成低精度整数应用举例。 #include main() double m=65536; double n=65535; printf(n%d,%d,(int)m,(int)n); /*把m和n分别转换成int型的整数后输出*/ ,程序的运行结果为: 0,-1,例2.16 强制类型转换在函数参数方面的应用举例。 #include #include main() int a=100; double b; b=sqrt(double)a);/*求a的平方根*/ printf(n%f,b); ,程序的运行结果为: 10.000000,3.赋值表达式的类型转换,

41、当赋值表达式左边的变量与赋值运算符右边的表达式的数据类型相同时,不需要进行数据类型的转换。 当赋值表达式左边的变量与赋值运算符右边的表达式的数据类型不相同时,系统负责将右边的数据类型转换成左边的数据类型。此时会发生以下两种情况: (1)转换后不丢失数据。 (2)转换后丢失数据。,2.5 不同数据类型的输出,2.5.1 printf()函数 2.5.2 单字符输出函数putchar(),2.5.1 printf()函数,程序中用到printf函数时要在程序的开头部分用以下的命令: #include 或 #includestdio.h printf()函数的调用格式为: printf(格式控制字符

42、串,输出项清单);,1.格式转换说明符,格式转换说明符与各个输出项相对应,用来规定待输出项的显示格式。表2-11 列出了与不同种输出项对应的格式说明符。,表2-11printf函数的格式转换说明符,%d,%d :按整数的实际长度进行输出。,%md :m为指定的输出宽度。如果整数的位数小于m,则左补空格,如果整数的位数大于m,则按实际的位数输出。,%ld :输出长整型。长整型的输出也可以指定宽度,即%mld 。,例如: int a=567,b=12345; printf(”a=%4d,b=%4d”,a,b);,注:本书用“”表示空格。,格式控制符“%d”的应用举例,上述程序段的输出结果是: a=

43、567,b=12345。,%f,%f :不指定字段宽度,由系统自动指定,整数部分全部输出,小数部分输出6位。,%m.nf :指定输出的实数的宽度为m,其中n位为小数位。如果实际长度小于m,则左补空格。,%-m.nf :指定输出的实数的宽度为m,其中n位为小数。如果实际长度小于m,则右补空格。,格式控制符“%f”的应用举例,#include main() float a=345.678; printf(%f,%10f,%10.2f,%.2f,%-10.2f,a,a,a,a,a); ,程序的输出结果为: 345.678009,345.678009, 345.68,345.68,345.68 ,%c

44、,%c用来输出单个字符。,#include main() int a=100; char ch=c; printf(na=%d,%cn,a,a); printf(ch=%d,%cn,ch,ch); ,程序的输出结果为: a=100,d ch=99,c,举例,%s:基本字符串输出形式,%ms,输出的字符串占m列。如果待输出的字符串的长度大于m,则按实际长度输出,如果待输出的字符串的长度小于m,则左侧补空格。,%-ms:如果待输出的字符串的长度小于m,则右侧补空格。,%m.ns,字符串输出占m列。如果n小于m,则只取字符串左端的n个字符,这些字符输出在右侧,左侧补空格;如果n大于m,则n个字符全部

45、输出。,%-m.ns :含义与%m.ns相反,%s,例2.21格式控制符“%s”的应用举例。 #include main() char *ch=Human; printf(%s,%7s,%-7s,%7.3s,%-7.3s,%3.2s, ch,ch,ch,ch,ch,ch); ,程序的输出结果为(代表空格): Human, Human,Human, Hum,Hum, Hu,%e,%e,%m.ne,-%m.ne,指定输出位共占m列,n为小数的位数。如果实际长度小于m,则右侧补空格。,指定输出位共占m列,n为小数的位数。如果实际长度小于m,则左侧补空格。,不指定输出数据所占的宽度和数字部分小数位数,

46、由系统指定给出的6位小数;指数部分占5位,其中“e”占1位,指数符号(+或-)占1位,指数占3位。,%e的应用举例,#include main() float a=123.789; printf(%e,a); ,程序的输出结果为:1.23789e+02,2.转义字符,转义字符主要用于控制数据的显示位置,如换行、换页等,常用的转义字符见表2-3。使用转义字符可以使程序的输出更加整齐。,转义字符应用举例,#include main() printf(natbnctd); ,程序的输出结果为: ab cd,3.普通字符,格式控制字符串中除格式控制符和转义字符以外的其他字符都视为普通字符,与输出项无关

47、,输出时按原样显示。,2.5.2单字符输出函数putchar(),C语言提供的putchar()用于单字符的输出,其调用的一般格式为: putchar(c); 其中c是一个字符型常量或变量,也可以是一个不大于255的整型常量或变量。该函数的功能是向标准输出设备(一般指屏幕终端)输出一个字符。 程序中用到putchar函数时要在程序的开头部分用以下的命令: #include或 #include stdio.h,用putchar输出可以显示的字符时,只需把待输出的字符作为其参数即可。例如,输出字符c可以有以下几种形式: (1)char x; x=c; putchar(x); (2)putchar(

48、c); (3)putchar(99);/*99为c的ASCII码的十进制形式*/ 用putchar还可以输出不可显示的字符,例如,输出一声响铃可以用以下两种形式: (1)putchar(007); (2)putchar(007); 再如用 putchar(n);可以控制换行。,2.6 不同数据类型的输出,2.6.1 scanf()函数 2.6.2单字符输入函数getchar()、getche()和getch(),2.6.1 scanf()函数,1.格式控制字符串 2.地址列表 3.scanf()函数的几个特殊控制 4.使用scanf()函数的注意事项,scanf()函数可以用于所有类型数据的输

49、入,使用不同的格式转换符可以将不同类型的数据从标准输入设备读入内存。 程序中用到scanf函数时要在程序的开头部分用以下的命令: #include或#includestdio.h scanf()函数的调用格式为: scanf(格式控制字符串,地址表列);,1.格式控制字符串,scanf函数中“格式控制字符串”只包含格式转换说明符和分隔符,没有转义字符和普通字符。 常用的格式转换说明符如表2-12所示。,表2-12 scanf格式转换说明符,2.地址列表,scanf函数中的“地址列表”由一个或几个地址组成,多个地址之间用逗号隔开。 例2.24使用scanf函数输入四个整数。 #include m

50、ain() int a,b,c,d; printf(Please input four number:); scanf(%d,%d,%d,%d” /*输出4个整数*/ ,程序的输出结果为(本书约定表示回车): Please input four number:1,2,3,4 The number you input are: 1,2,3,4,说明:上述程序中scanf()函数中的各个格式控制符用逗号隔开(“%d,%d,%d,%d”)因此输入的各个数也要用逗号隔开。如果格式控制中没有逗号,则输入的各个数之间可以使用一个或多个空格键、回车键、Tab键来分隔。例如对于如下的语句: scanf(%d%

51、d%d%d的意思是将输入的数据存放到变量a所指的存储单元中。,3. scanf()函数的几个特殊控制,1)抑制赋值: 在百分号“%”之后、转换控制字符之前加上一个星号“*”时,scanf函数将正常读入对应的数据,但不赋值。例如,%*c将抑制一个输入的字符;%*d将抑制一个输入的整数。 2)限制接收字符的个数:在百分号“%”之后、转换控制字符之前加上一个整数,可以规定从输入数据中接收的字符的个数。如果连续输入的字符个数超过指定的长度,则多余的字符被截断;反之若连续输入的字符的个数尚未达到指定的长度而提前遇到分隔符,则只接收分隔符之前的字符。,例2.25scanf()函数中的特殊控制符“*”应用举

52、例。 #include main() int a,b; scanf(%d%*c%d,/*输出a和b的值*/ 分析:程序运行时若从键盘输入:10/20回车,则scanf函数把10赋给a,20赋给b,字符“/”被忽略。即%*c的作用是跳过一个输入的字符。 因此对应的程序输出结果为:,10,20,例2.26scanf()函数中限制接收字符个数的特殊控制举例。 #include main() int a,b; printf(Please input two number:n); scanf(%4d%4d, 分析:程序运行时,如果输入:123空格32658回车,则将123赋给变量a(分隔符空格之前的输入数据不足4位,只接收分隔符之前的字符),将3265赋值给变量b(输入的数据超过4位

温馨提示

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

最新文档

评论

0/150

提交评论