第2章 数据类型、运算符和表达式(加动画16:9)_第1页
第2章 数据类型、运算符和表达式(加动画16:9)_第2页
第2章 数据类型、运算符和表达式(加动画16:9)_第3页
第2章 数据类型、运算符和表达式(加动画16:9)_第4页
第2章 数据类型、运算符和表达式(加动画16:9)_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

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

文档简介

第2章程序中的数据2.3数据类型转换及数据的溢出误差2.4数据的输入/输出2.5程序案例本章小结学生自我完善练习目录2.1数据类型、变量与常量2.2运算符与表达式2.1数据类型、变量与常量在C语言中,每个数据都属于唯一的一种数据类型,没有无类型的数据。C语言的数据类型如图2-1所示。2.1.1数据类型概述2.1数据类型、变量与常量C语言的基本类型有三种:字符型、整型和实型(浮点型)。C语言的基本类型修饰符有四种:signed(有符号)、unsigned(无符号)、long(长型符)和short(短型符),这些类型修饰符可以与字符型或整型数据配合使用。基本数据类型和取值范围如表2-1所示。2.1.1数据类型概述2.1数据类型、变量与常量表2-1C语言基本数据类型描述类型说明内存单元个数取值范围char字符型1(8位)-128~127即-27~(27-1)unsignedchar无符号字符型1(8位)0~255

即0~(28-1)signedchar有符号字符型1(8位)-128~127即-27~(27-1)int整型2(16位)-32768~32767即-215~(215-1)unsignedint无符号整型2(16位)0~65535

即0~(216-1)signedint有符号整型2(16位)-32768~32767即-215~(215-1)shortint短整型2(16位)-32768~32767即-215~(215-1)unsignedshortint无符号短整型2(16位)0~65535

即0~(216-1)signedshortint有符号短整型2(16位)-32768~32767即-215~(215-1)longint长整型4(32位)-2147483648~2147483647即-231~(231-1)unsignedlongint无符号长整型4(32位)0~4294967295

即0~(232-1)signedlongint有符号长整型4(32位)-2147483648~2147483647即-231~(231-1)float单精度实型4(32位)-3.4E+38~3.4E+38double双精度实型8(64位)-1.7E+308~1.7E+3082.1数据类型、变量与常量1.标识符

所谓标识符,是指用来标识程序中用到的变量、函数、类型、数组、文件以及符号常量等的有效字符序列。

在C语言中,标识符只能由字母、数字和下划线组成,第一个字符必须为字母或下划线。2.1.2标识符2.1数据类型、变量与常量2.关键字关键字又称保留字,是C语言规定的具有特定意义的标识符,它们有特定的含义,不能做其他用途使用。C语言的关键字有32个,可分为以下四类。(1)标识数据类型的关键字(14个):int,long,short,char,float,double,signed,unsigned,struct,union,enum,void,volatile,const。(2)标识存储类型的关键字(5个):auto,static,register,extern,typedef。(3)标识流程控制的关键字(12个):goto,return,break,continue,if,else,while,do,for,switch,case,default。(4)标识运算符的关键字(1个):sizeof。2.1.2标识符2.1数据类型、变量与常量1.变量概述在程序运行过程中,其存储的值可以被改变的量称为变量。变量定义必须放在变量使用之前,一般放在函数体的开头部分。要区分变量名和变量值是两个不同的概念。例如整型变量a的值为3,则变量a在内存中的存储形式如图2-2所示。2.1.3变量的定义、赋值和初始化2.1数据类型、变量与常量2.变量的说明变量定义的一般格式如下:

数据类型

变量名1[,变量名2,变量名3,…

,变量名n];2.1.3变量的定义、赋值和初始化

其中中括号“[]”括起来的部分为可选项,省略号为多次重复。例如:intx,y,z; /*定义三个整型变量x、y和z*/floati,j; /*定义两个单精度浮点型变量i、j*/2.1数据类型、变量与常量3.变量的赋值和初始化(1)变量的赋值。定义变量后,在使用之前需要给定一个初始值。在C语言中,可以通过赋值运算符“=”给变量赋值。变量赋值语句的一般格式如下。例如:intx;/*定义一个整型变量x,此时x的值是不确定的*/x=3; /*给变量赋初值为3*/变量名=表达式;2.1.3变量的定义、赋值和初始化2.1数据类型、变量与常量(2)变量的初始化。在定义变量的同时为其赋值,称为变量的初始化。定义的变量可以全部初始化,也可以部分初始化。例如:intx=3,y=5,z; /*定义三个整型变量x、y和z,并为x赋初值为3,y赋初值为5*/intx=10,y=10,z=10; /*定义三个整型变量x、y和z,并都赋初值为10*/intx=y=z=10; /*错误,不允许在定义时连续赋初值*/intx=10.5; /*定义整型变量x,赋初值为10而不是10.5(小数的整数部分)*/longy=99; /*定义一个长整型变量y,并为变量y赋初值99*/提示:变量没初始化时其值是多少?没有被赋值的变量其初值取决于存储类型,静态存储的变量将自动为0,否则被随机初始化,其值为不确定的数值。2.1.3变量的定义、赋值和初始化2.1数据类型、变量与常量

在计算机内,机器数有无符号和带符号数之分。无符号数表示正数,在机器数中没有符号位。位于无符号数,若约定小数点的位置在机器数的最低位之后,则是纯整数;若约定小数点的位置在机器数的最高位之前,则是纯小数。对于带符号数,机器数的最高位是表示正、负的符号位,其余位则表示数值。

带符号位的机器数可采用原码、反码和补码等不同的编码方法,机器数的这些编码方法称为码制。2.1.4数的原码、反码和补码表示2.1数据类型、变量与常量1.原码原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。例如:[+45]原=00101101[-45]原=101011012.1.4数的原码、反码和补码表示2.1数据类型、变量与常量2.反码反码是数值存储的一种,但是由于补码更能有效表现数字在计算机中的形式,所以多数计算机一般都不采用反码表示数。反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。例如:[+45]反=00101101[-45]反=110100102.1.4数的原码、反码和补码表示2.1数据类型、变量与常量3.补码在计算机系统中,数值一律用补码来表示和存储。这是因为使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。反码表示法规定:正数的补码与原码相同,负数的补码为其原码除符号位外所有位取反(得到反码),然后最低位加1。例如:[+45]补=00101101[-45]补=110100112.1.4变量的存储形式2.1.4数的原码、反码和补码表示2.1数据类型、变量与常量2.1.4变量的存储形式2.1.4数的原码、反码和补码表示原码、反码和补码转换过程如图2-3所示。2.1数据类型、变量与常量1.整型整型数据没有小数部分。根据整数的存储长度,可分为以下几种(即变量的类型)。(1)基本整型:类型名为int。(2)短整型:类型名为shortint或short。(3)长整型:类型名为longint或long。整型还可以细分为:(1)有符号整数:加上修饰符singed,可以描述正整数、负数和0。(2)无符号整数:加上修饰符unsinged,可以描述正整数和0。2.1.5整型及整型常量2.1数据类型、变量与常量2.整型常量整型常量又称整数,整数有3种数制来表示(不用二进制表示整数)。(1)十进制整型常量:十进制整常数没有前缀,其数字为0~9,如237、-568等。(2)八进制整型常量:以数字0开头,由数字0~7来表示。八进制数通常是无符号数,如015、026。(3)十六进制整型常量:以数字0和字符X或x(即0X或0x)开头,由数字0~9和字符A~F或a~f表示,如0x2A(十进制数为42)、0XFFFF(十进制数为65535)。(4)整型常量的后缀:在整型数后加后缀“L”或“l”来表示长整型数,加后缀“U”或“u”来表示无符号整型数。2.1.5整型及整型常量2.1数据类型、变量与常量【案例2-1】十进制、八进制、十六进制整数的输出。单击打开源程序程序运行结果2.1.5整型及整型常量2.1数据类型、变量与常量1.实型实型也称为浮点型,包括(即变量类型):(1)单精度浮点类型:简称浮点类型,类型名为float。(2)双精度浮点类型:简称双精度类型,类型名为double。(3)长双精度类型:类型名为longdouble。2.1.6实型及实型常量2.1数据类型、变量与常量例如:float x;/*定义单精度浮点型变量x*/double y;/*定义双精度浮点型变量y*/x=4.72; /*为变量x赋小数4.72*/y=1.235E+5;/*为变量y赋长整数1.235×105*/2.1.6实型及实型常量2.1数据类型、变量与常量【案例2-2】各种形式实数的输出。单击打开源程序程序运行结果程序分析(1)%f为单精度小数的输出格式,默认输出为小数点后6位有效数字。(2)%lf为双精度小数。%.9lf表示输出小数点后9位有效数字。可以看到单精度x的有效数字不能全部存储进去,而双精度y的有效数字可以全部存储。所以如果要存储精度高的小数,应该采用双精度浮点型存储。2.1.6实型及实型常量2.1数据类型、变量与常量2.实型常量实型常量也称为实数或者浮点数。实数只有十进制,包括:十进制小数形式和指数形式。(1)十进制小数形式。小数形式是由数字0~9和小数点组成的(注意:必须有小数点)。例如:6.789,.789(省略小数点前0),6.(省略小数点后0),0.0都是合法的十进制小数。(2)指数形式。由十进制小数加上阶码标志字符“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为:aEn,其中a为十进制数,n为十进制整数,其值为a×10n。例如2.35E-3,表示2.35×10-3。2.1.6实型及实型常量2.1数据类型、变量与常量【练习2-4】以下各种小数表示哪些是合法的?哪些是非法的?2.1E5、3.7E-2、0.5E7、345、-2.8E-2、E7、-5、53.-E3、2.7E解:(1)合法的实数:2.1E5(等于2.1*105),3.7E-2(等于3.7*10-2),0.5E7(等于0.5*107),-2.8E-2(等于-2.8*10-2)。(2)非法的实数:345(无小数点),E7(阶码标志E之前无数字),-5(无阶码标志),53.-E3(负号位置不对),2.7E(无阶码)。2.1.6实型及实型常量2.1数据类型、变量与常量1.字符类型字符类型的数据简称字符型,包括(即其变量类型):(1)有符号字符型,类型名称为char,存储数据取值范围为-128~127。(2)无符号字符型,类型名称为unsignedchar,存储数据取值范围为0~255。字符型数据在内存中存储的是其ASCII编码值(为一个整数),所以字符数据和整型数据是在C语言中可以通用的,只不过字符存储字节为1个字节。2.1.7字符型及字符型常量、字符串常量2.1数据类型、变量与常量2.字符常量

字符常量是由一对单引号括起来的一个字符。字符型数据占一个字符,其书写形式是用单引号括起来的单个字符。例如:'a','A','@','?'等。常用字符的ASCII编码如下:(1)字符’A’~’Z’的ASCII编码值为65~90。(2)字符’a’~’z’的ASCII编码值为97~122。(3)字符’0’~’9’的ASCII编码值为48~57。(4)空格字符的ASCII编码值为32。例如,a的十进制ASCII码是120,b的十进制ASCII码是121,实际上是在内存变量a和b分别存放120和121的二进制数。整型常量在内存中占2个字节,字符常量在内存中占1个字节,当整型量按字符型量处理时,只有低8位字节参与处理。2.1.7字符型及字符型常量、字符串常量2.1数据类型、变量与常量【练习2-5】下面哪个是合法的字符常量?'f'、'Q'、'abc'、x、"A"、'+'、'!'解:(1)合法的字符常量为(单引号内一个字符):'f'、'Q'、'+'、'!'。(2)非法的字符常量为:'abc'(单引号内多个字符)、x(没有单引号)、"A"(分隔符为双引号)。2.1.7字符型及字符型常量、字符串常量2.1数据类型、变量与常量转义字符。转义字符主要用来表示那些用一般字符不便于表示的控制代码,是一种特殊的字符常量。转义字符以反斜线“\”开头,后跟一个或几个字符。2.1.7字符型及字符型常量、字符串常量2.1数据类型、变量与常量【练习2-6】下面哪个是合法的转义字符?'\\'、'\abc'、'\"'、\x、'\125'、'\x24'、'\xabc'解:(1)合法的转义字符常量:'\\'(反斜杠)、'\"'(双引号)、'\125'(八进制ASCII为125的字符'7')、'\x24'(十六进制ASCII为24的字符'$')。(2)非法的转义字符常量:\x(没有分隔符单引号)、'\xabc'(x后的十六进制数位数应该为2位而不是3位)。2.1.7字符型及字符型常量、字符串常量2.1数据类型、变量与常量3.字符串常量字符串常量是用一对双引号括起来的零个或多个字符序列,如"hello","","abc","123"等。字符常量与字符串常量的区别。字符串常量和字符常量是不同的量,它们之间主要有以下区别:(1)字符常量由单引号括起来,字符串常量由双引号括起来。(2)字符常量只能是单个字符,字符串常量则可以含一个或多个字符。(3)可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。(4)字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1,增加的一个字节中存放字符'\0'(ASCII码为0),这是字符串结束的标志。2.1.7字符型及字符型常量、字符串常量2.1数据类型、变量与常量例如,字符串"Hello"存储情况如下:【案例2-3】字符常量、字符串常量的输出。单击打开源程序程序运行结果2.1.7字符型及字符型常量、字符串常量2.1数据类型、变量与常量

在C语言中,也可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先定义,其一般形式为:#define符号常量

值例如:#definePI3.14 /*定义一个符号常量PI,其值为3.14*/符号常量的特点是:

习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。

符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。2.1.8符号常量2.2运算符与表达式C语言的运算符非常丰富,共有13类45个运算符,C语言运算符如表2-5所示。2.1.8符号常量2.2运算符与表达式1.算术运算符C语言中算术运算符共有5个,分别为:+(加)、-(减)、*(乘)、/(除)、%(取余,或取模)。其运算优先级别,结合方式如表2-5所示。(1)算术运算符为双目(需要两个操作数)运算符,结合方式均为从左到右。(2)求余运算符“%”又称取模运算符,要求其两侧必须为整型数,它的作用是取两个整型数相除的余数,余数的符号与被除数的符号相同。例如9%4结果是1;若-9%4的结果为-1;若9%-4的结果是1。(3)除法运算符“/”。当两个操作数都是整数时,运算的结果是整数(舍去小数取整),即表示“整除”;如果参加运算的两个数中有一个是实数,则结果是实数。例如9/4结果是2;若9.0%4的结果为2.25。2.2.1算术运算符与算术表达式2.2运算符与表达式++(自增)、--(自减)运算符是C语言中使用方便且效率很高的两个运算符,它们都是单目运算符。这两个运算符有前置和后置两种形式。前置就是指运算符在操作数的前面,例如++x和--x;后置就是指运算符在操作数的后面。运算规则如下:

若只对某变量自增(自减)而不参与其他赋值运算,结果都是该变量本身自增(自减)1。

若某变量自增(自减)的同时还要参加其他运算,则前缀运算是自变量先自增(减)后再参与表达式运算,后缀运算是自变量先参与表达式运算后再自增(减)。2.2.2自增、自减运算符(++、--)2.2运算符与表达式连续自增语句(以TC为例)。例如:inti=3,j;j=(++i)+(++i)+(++i);/*j的值为18,i的值为6;先将i自增3次后将3个i相加赋给j*/j=(i++)+(i++)+(i++);/*j的值为9,i的值为6;先将3个i相加赋给j,再将i自增3次*/连续自增作为printf()函数的输出项问题。inti=3;printf("\n%d",(++i)+(++i)+(++i));/*输出15。自右向左逐步自增和取值即6+5+4*/2.2.2自增、自减运算符(++、--)2.2运算符与表达式inti=3;printf("\n%d",(i++)+(i++)+(i++));/*输出12。自右向左逐步取值和自增即5+4+3*/printf()函数中多输出项计算问题,(TC和VC略有不同)。输出项自右向左运算后,再自左向右输出。例如:inti=3;printf("\n%d,%d,%d",++i,++i,++i);(TC输出6,5,4,VC下输出6,5,4)inti=3;printf("\n%d,%d,%d",i++,i++,i++);(TC输出5,4,3,VC下输出3,3,3)2.2.2自增、自减运算符(++、--)2.2运算符与表达式【案例2-4】自增、自减表达式的各种结果(程序中注释按TC规范)。单击打开源程序程序运行结果如下2.2.2自增、自减运算符(++、--)2.2运算符与表达式1.赋值表达式格式赋值表达式是由赋值运算符“=”将一个变量和表达式连接起来的式子,其一般格式为:变量=表达式即将“=”右边表达式的值赋给左边的变量,表达式可以是符合C语言语法的各种表达式。例如:intx,y;/*定义整型变量x和y*/x=3;/*表示将常量3赋给变量x*/y=x+2;/*表示将表达式x+2的值赋给变量y*/2.2.3赋值运算符与赋值表达式2.2运算符与表达式2.几点说明(1)如果赋值运算两侧的类型不一致,在赋值时要将表达式的结果转换成变量的类型,然后再赋给变量。赋值运算方向为自右向左。例如:inta,b;/*定义整型变量a和b*/a=b=12;/*从右向左进行赋值,即先将12赋给b,再将b值赋给a*/相当于先执行b=12,再执行a=b。(2)同一变量连续赋值。对同一变量连续赋值时,相当于只有最后一步有效。2.2.3赋值运算符与赋值表达式2.2运算符与表达式例如:inta;/*定义整型变量a*/a=5;/*为变量a赋值5*/a=10;/*为变量a赋值10(此时原来的值5已经被覆盖)*/则变量a的值为10,原来的值5已经被覆盖了。3.复和赋值运算符赋值运算符与算术运算符相结合之后,变成复合赋值运算符,如表2-5所示。例如:a+=b;相当于a=a+b;2.2.3赋值运算符与赋值表达式2.2运算符与表达式1.关系运算符关系运算符用于比较两个运算对象的大小。关系运算符有6种:<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、==(等于)、!=(不等于)。C语言提供的关系运算符如表2-5所示。2.关系表达式关系表达式的一般形式为:表达式关系运算符表达式2.2.4关系运算符与关系表达式2.2运算符与表达式3.几点说明(1)在上述6个运算符中,前4个运算符的优先级高于后2个运算符的优先级。(2)应将等于关系运算符“==”与赋值运算符“=”相区分。“==”是关系运算符,用于比较运算;而“=”是赋值运算符,用于赋值运算。(3)关系运算符的优先级低于算术运算符而高于赋值运算符。它们的结合方式是自左至右。2.2.4关系运算符与关系表达式2.2运算符与表达式

1.逻辑运算符逻辑运算符用来对运算对象进行逻辑操作,逻辑运算符有三种:&&(逻辑与)、||(逻辑或)和!(逻辑非)。C语言提供的逻辑运算符及其功能如表2-5所示。2.2.5逻辑运算符与逻辑表达式2.2运算符与表达式2.逻辑表达式逻辑表达式的一般形式为:逻辑表达式的值也是逻辑值,即0或1。3.优先级常用的C语言运算符优先级别如图2-6所示。表达式逻辑运算符表达式2.2.5逻辑运算符与逻辑表达式2.2运算符与表达式5.逻辑表达式的短路现象

在C语言逻辑表达式中,有时会出现计算完&&或||左侧的表达式,就不用再计算右侧的表达式的情况,这种情况被称为逻辑表达式的短路现象。这主要是因为&&或||的运算特点造成的。

若&&运算符左边的表达式为假(或0),则其右侧表达式将不再计算,整个表达式必然为假;同理,若||运算符左边的表达式为真(或非0值),则其右侧表达式将不再计算,整个表达式必然为真。2.2.5逻辑运算符与逻辑表达式2.2运算符与表达式例如:9<3&&++a因为表达式9<3的值为0,因此&&右侧的表达式将不再计算,a值不进行自加,整个表达式的值为0。9>3||++a因为表达式9>3的值为1,因此||右侧的表达式将不再计算,a值不进行自加,整个表达式的值为1。2.2.5逻辑运算符与逻辑表达式2.2运算符与表达式C语言中保留了低级语言中的二进制位运算符,以提高计算的灵活性与效率。位运算分为移位运算与按位逻辑运算。移位运算包括按位左移(<<)和按位右移(>>),按位逻辑运算包括按位求反(~)、按位与(&)、按位或(|)和按位异或(^)。

位运算符是对其操作数按二进制形式逐步地进行逻辑运算或移位运操作的,运算对象为char、short、int等类型数据,但不能是浮点型数据。2.2.6位运算符优先级运算符名

称运算符类型结合方式5<<、>>左移、右移位(双目)运算符由左向右8&按位与位(双目)运算符由左向右9^按位异或位(双目)运算符由左向右10|按位或位(双目)运算符由左向右2.2运算符与表达式【案例2-5】阅读下面程序,分析并写出程序运行结果。单击打开源程序程序运行结果2.2.6位运算符2.2运算符与表达式1.条件运算符和条件表达式

条件运算符是由字符“?”和“:”组成的,要求有三个运算对象,是C语言中唯一的三目运算符。条件运算符的优先级高于赋值运算和逗号运算符,而低于其他运算符,其结合方式为自右至左。

条件表达式是由条件运算符将运算对象连接起来的式子,其一般格式为:表达式1?

表达式2:

表达式32.2.7其他运算符2.2运算符与表达式

条件表达式的求解过程为:先求解表达式1,若表达式1的值为1(真),则求解表达式2,并将其作为整个表达式的值;如表达式1的值为0(假),则求解表达式3,并将其作为整个表达式的值。

求两个数a和b中的最大值,用条件表达式表示如下:a>b?a:b2.2.7其他运算符2.2运算符与表达式2.逗号运算符和逗号表达式在C语言中,符号“,”除了做分隔符外,还可以作为运算符将若干个表达式连接在一起形成逗号表达式。逗号表达式的一般格式为:逗号表达式的运算规则是:先求解表达式1,再求解表达式2,依次求解到表达式n,最后一个表达式的值就是整个逗号表达式的值。逗号运算符的优先级最低,结合方式为自左至右。表达式1,表达式2,…,表达式n2.2.7其他运算符2.2运算符与表达式3.括号运算符和括号表达式圆括号运算符“()”的优先级最高,用它将某些运算符和运算对象括起来以后,这些括起来的运算符和运算对象要优先运算。例如,s=(a=1,b=2,c=3,c=a*(b+c));,尽管运算符“*”的优先级比运算符的“+”的优先级高,但由于(b+c)使用了圆括号运算符,故应优先运行b+c。2.2.7其他运算符2.2运算符与表达式4.求字节运算符sizeofsizeof的定义格式如下:其功能为测定某一种类型数据所占存储空间长度,结果是该类型在内存中所占的字节数。括号内可以是该数据类型名或是该类型的变量名。例如:intx;x=sizeof(int); /*求整型变量的内存所占字节数,TC中语句执行的结果是x的值为2*/也可以写为:x=sizeof(x); /*函数的返回值也是2*/sizeof(数据类型名)

sizeof(变量名)2.2.7其他运算符2.2运算符与表达式【案例2-6】编写一个程序,用sizeof运算符求字符型、短整型、基本整型、长整型、单精型浮点型、双精度浮点的内存字节数。单击打开源程序程序运行结果2.2.7其他运算符2.3数据类型转换及数据的溢出误差C语言有丰富的数据类型,各不同的数据类型的存储长度和存储方式不同,一般不能直接混合运算。在C语言中,数据类型的转换方式有三种:自动类型转换、赋值类型转换和强制类型转换。2.3.1类型转换概述2.3数据类型转换及数据的溢出误差1.不同数据类型的差异数据类型的差异体现在存储数据的范围和精度上,存储数据的范围越大、精度越高,该类型越“高级”。2.数据类型转换产生的效果(1)数据类型级别的提升与降低:短数据转换成长数据;整数转换成实数;signed型转换成unsigned型。(2)符号位扩展与零扩展。为保持数值不变,整型短数据转换成整型长数据时将产生符号位扩展与零扩展。2.3.1类型转换概述2.3数据类型转换及数据的溢出误差例如:intx=’a’;字符’a’的二进制形式和intx的二进制形式如图2-7所示。2.3.1类型转换概述2.3数据类型转换及数据的溢出误差(3)截去高位产生数值的变化。通过上面学习可以得到,如果把长类型的数据赋值给短类型的变量,必然将产生丢失高位字节的效果。(4)丢失精度。实数转换成整数时,由于截去小数将丢失精度。double型转换成float型时,有效数字减少(四舍五入),精度丢失。long型转换成float型时,由原来可达10位整数变成只有7位有效数字,精度丢失,但由于数的范围扩大了,数据类型从较低级提升到高级。2.3.1类型转换概述2.3数据类型转换及数据的溢出误差自动类型转换是指在C语言中,不同的数据可以出现在同一个表达式中。在进行运算时,C语言自动进行必要的数据类型转换,以完成表达式的求值。2.3.2自动类型转换2.3数据类型转换及数据的溢出误差赋值运算时,如果赋值运算符两侧的类型(指基本类型)不一致,系统自动将表达式转换成变量的类型存到变量的存储单元中,转换的情况有以下几种。(1)整型赋给实型变量时,数值上不发生任何变化。例如:floatx;x=24;(2)实型数据赋给整型变量时,小数部分将舍弃。例如:intx;x=25.48;(3)短的有符号整型赋给长整型变量时,需要进行符号位扩展。(4)短的无符号整型赋给长整型变量时,需要进行0扩展。(5)长整型数据赋给短整型变量时,有可能溢出。例如:charx=324;溢出x值为’d’。(6)同长度有符号整型数据赋给无符号整型数据时,数据将失去符号位功能。(7)同长度有符号整型数据赋给有符号整型数据时,数据将得到符号位功能。2.3.3赋值类型转换2.3数据类型转换及数据的溢出误差强制类型转换的运算格式如下:强制类型转换用于不能自动转换的情况。例如:(int)3.14/*将3.14转换成整型,其值为3*/(int)(3.14+4.78)/*将表达式3.14+4.78的和7.92转换成int型,值为7*/(int)3.14+4.78 /*将3.14转换成int型的值3,然后再加上4.78,值为7.78*/(类型)表达式

或类型(表达式)2.3.4强制类型转换2.3数据类型转换及数据的溢出误差1.数据的溢出因为C语言定义的各种数据类型长度有限,所以有时为不同数据类型赋值或运算时,可能会发生数据溢出现象,即所得数据值超出所能存放的最大值,结果为非正确的数据。例如:charx=127;x=x+1;其二进制变化情况如图2-9和图2-10所示。2.3.5数据的溢出和误差2.3数据类型转换及数据的溢出误差127加1后并没有等于128,因为char型的数据最大值是127,加1后溢出,变成负数-128的补码了。同理,直接将128赋给字符型变量x,结果一样,x无法存储128,存储的还是-128的补码。2.3.5数据的溢出和误差2.3数据类型转换及数据的溢出误差【案例2-7】演示各种类型数据的溢出。单击打开源程序程序运行结果通过上面案例可以看出,不同数据类型的数据存储值都有下限和上限,所以在定义数据类型时要注意运算的数值的大小,来决定数据类型的定义。2.3.5数据的溢出和误差2.3数据类型转换及数据的溢出误差2.实数的误差整数存储除了溢出以外是没有误差的。然而实型数据由于是用有限的存储单元存储较大范围的实数,有效数字是有尾数限制的,在实际计算和引用中会有很多问题。例如,如果将一个非常大的数加上一个非常小的数,小数就会被忽略。或是在计算时,小数的有效位加上一个数是有效的,如果无效位上加上一个数还是无效的。2.3.5数据的溢出和误差2.3数据类型转换及数据的溢出误差【案例2-8】演示实数的误差。单击打开源程序程序运行结果2.3.5数据的溢出和误差2.4数据的输入/输出C语言提供的函数以库的形式存放在系统中,它们不是C语言文本中的组成部分。在使用函数库时,要用到预编译命令#include将有关的“头文件”包含到用户源文件中。例如:#include“stdio.h”/*标准输入、输出头文件包含命令*/

预编译命令一般放在程序的开头,使用不同类型的函数需要包含不同的“头文件”。在C语言中经常使用的输入、输出函数主要有格式化输出函数(printf)、格式化输入函数(scanf)、字符输出函数(putchar)和字符输入函数(getchar)。2.4数据的输入/输出1.printf的函数调用形式printf是系统标准库函数,其调用一般形式为:printf括号内有两项,前一项是输出数据的格式(即要输出什么类型的数据),后一项是输出数据名称(即要输出哪个变量)。

printf("格式控制字符串",输出列表

);2.4.1格式化输出函数printf2.4数据的输入/输出格式字符串内部有两个信息。(1)格式说明。它的作用是将要输出的数据转化为指定的格式输出。通常默认形式是“%”加上一个字符,如%d表示十进制整数格式控制符,%f表示小数格式控制符等。(2)普通字符。除了格式说明符外,所有字符均按原样输出。例如:intx=3;printf(“x=%d”,x);输出结果为:x=32.4.1格式化输出函数printf2.4数据的输入/输出2.printf的格式说明如果要输出复杂的格式,可以设置格式控制符,就可以按用户的格式要求来输出相关数据。一般是“%”加上若干个英文字母,用以说明数据输出的类型、长度、位数等。格式控制符的一般形式为:

%[标志][输出最小宽度][.精度][长度]类型2.4.1格式化输出函数printf2.4数据的输入/输出其中有方括号[]的项为可选项。各项的意义如下。(1)标志:可以是-、+、0。因为printf的默认格式是右对齐,左边输出空格。如果想按左对齐方式输出,则标志写“-”。如果想让空白位输出0,则标志写“0”。如果想让正数前面输出“+”号,则标志写“+”。(2)输出最小宽度:十进制整数。表示按此数值作为数据宽度输出。例如:printf(“%+5d”,21);/*输出结果为□□+21,其中5为输出宽度,□为空格*/printf(“%-5d”,21);/*输出结果为21□□□,其中5为输出宽度,□为空格*/printf(“%05d”,21);/*输出结果为00021,5为输出宽度,前面的0为表示占位用数字0*/2.4.1格式化输出函数printf2.4数据的输入/输出(3)精度:精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。如果输出的是字符串,则表示输出字符的个数。例如:printf(“%7.2f”,123.456789);/*输出结果为□123.46,其中7为输出总宽度,2为小数点后位数*/printf(“%7.5s”,”BoyAndGirl1”);/*输出结果为□□BoyAn,其中7为输出总宽度,5为输出字符个数,□为空格*/(4)长度:可以是h、l。h表示是按短整型输出,l表示按长整型输出。例如:longx=356;printf(“%5ld”,x);/*输出结果为□□356,其中5为输出宽度,长整型需要加l*/(5)类型:是格式说明符中必须有的项。它表示输出列表里要输出的数据类型。常用的数据类型格式控制符如表2-7所示(所有格式字符必须小写)。2.4.1格式化输出函数printf2.4数据的输入/输出表2-7printf函数的常用类型控制字符表2.4.1格式化输出函数printf格式字符意义d按十进制形式输出带符号的整数(正数前无+号)o按八进制形式无符号输出(无前导o)x按十六进制形式无符号输出(无前导ox)u按十进制无符号形式输出c按字符形式输出一个字符f按十进制形式输出单、双精度浮点数(默认6位小数)e按指数形式输出单、双精度浮点数s输出以\o结尾的字符串2.4数据的输入/输出3.printf的输出列表printf函数中的“输出列表”部分由表达式组成,这些表达式应与“格式控制字符串”中的格式说明符的类型一一对应,若“输出列表”中有多个表达式,则每个表达式之间应由逗号隔开,各输出项可以是任意合法的表达式(包括常量、变量和函数调用)。因此printf函数也具有计算的功能。printf("%d\n",100); /*输出显示:100*/printf("%d\n",12340000+5678); /*输出显示:12345678*/printf("%f\n",(x=123.0)+(y=0.4567)); /*输出显示:123.456700*/printf("%6.2f\n",123.4567); /*输出显示:123.46*/printf("%.3f\n",123.4567); /*输出显示:123.457*/2.4.1格式化输出函数printf提示:定义浮点型变量时要注意小数的精度问题浮点型数据在赋值的过程中,float型的变量x只能接收7位有效数字,而double型的变量y能接收15~16位有效数字。如果赋值的小数后的位数过多或过少,都会造成数据的精度丢失或不足。2.4数据的输入/输出【案例2-9】演示各种数据的输出格式。单击打开源程序程序运行结果2.4.1格式化输出函数printf2.4数据的输入/输出scanf函数的功能是从键盘上将数据按用户指定的格式输入给指定的变量。1.scanf的函数调用形式scanf函数是系统标准库函数,其调用一般形式为:其中格式控制字符串的定义与使用方法与printf相同,但不能显示非格式字符。地址列表是要赋值的各变量地址。地址是由地址运算符“&”后跟变量名组成。如&a表示变量a的地址。scanf("格式控制字符串",地址列表

);2.4.2格式化输入函数scanf2.4数据的输入/输出2.scanf的格式说明如果要输入不同类型的数据,可以设置格式控制符,C语言允许按用户的格式要求来输入相关数据。一般是“%”加上若干个英文字母,用以说明数据输入的类型、长度、位数等。格式控制符的一般形式为:

%[*][宽度][长度]类型2.4.2格式化输入函数scanf其中有方括号[]的项为可选项,各项的意义如下。(1)[*]:表示输入的数值不赋给相应的变量,即跳过该数据不读。例如:scanf("%d%*d%d",&a,&b);当输入为:123时,将1赋给a,2被跳过,3赋给b。2.4数据的输入/输出(2)[宽度]:十进制整数,表示输入数据的最大宽度。例如:scanf("%5d",&a);输入:12345678↙只把12345赋给变量a,其余部分被截去。(3)[长度]:长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf),h表示输入短整型数据。(4)类型:是格式说明符中必须有的项。它表示地址列表里要输入的数据类型。2.4.2格式化输入函数scanf2.4数据的输入/输出3.scanf的地址列表在C语言中,使用了地址这个概念,这是与其他语言不同的。应该把变量的值和变量的地址这两个不同的概念区别开来,变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。例如:inta=567;则a为变量名,567是变量的值,&a表示变量a的地址。但在赋值号左边是变量名,不能写地址。而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。2.4.2格式化输入函数scanf2.4数据的输入/输出4.使用scanf函数注意事项(1)在用scanf函数输入数据时,不能规定精度。(2)scanf中要求给出变量地址,若给出变量名则会出错。(3)在输入多个数值数据时,若格式控制串中没有非格式字符做输入数据之间的间隔,则可用空格、Tab或回车。C编译在碰到空格、Tab、回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。(4)在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符(字符类型的空格也为有效字符常量)均为有效字符。2.4.2格式化输入函数scanf2.4数据的输入/输出(5)如果格式控制串中有非格式字符,则输入时也要输入该非格式字符。例如:scanf("%d,

温馨提示

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

评论

0/150

提交评论