数据类型及其运算_第1页
数据类型及其运算_第2页
数据类型及其运算_第3页
数据类型及其运算_第4页
数据类型及其运算_第5页
已阅读5页,还剩130页未读 继续免费阅读

下载本文档

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

文档简介

第2章数据类型及其运算1《C语言程序设计》第2章数据类型及其运算第2章数据类型及其运算2.1变量2.2常量2.3C语言的数据类型2.4运算符与表达式2.5数学函数2《C语言程序设计》第2章数据类型及其运算2.1变量2.1.1内存计算机中运行的程序,包括组成程序的指令和运行时所需要的数据,存储在计算机的内存中。计算机采用二进制存储数据,每一位二进制数称为1个比特(bit)。每8位二进制数构成1个字节(byte),用大写的B表示。为了方便访问内存中的数据,给每个字节做一个标记,这个标记称为地址。计算机的内存采用一维线性编址。计算机存储系统常用的单位包括千字节(KB)、兆字节(MB)和吉字节(GB)。3《C语言程序设计》第2章数据类型及其运算《C语言程序设计》第2章数据类型及其运算4图2-164KB内存空间示意图2.1变量2.1.2变量的基本概念程序运行时,其值能被改变的量称为变量。变量实质上就是计算机内存中一段有名字的由一个或若干个连续的字节构成的存储空间。每个变量都有一个名字,通过变量的名字可以访问到变量的存储空间并获得变量的数值。在C语言程序中通过定义变量来申请并命名这样的存储空间,并通过变量的名字来使用这段存储空间。变量是程序中数据的临时存放场所,可以用以保存程序运行时用户输入的数据和运算结果等。5《C语言程序设计》第2章数据类型及其运算2.1变量【例2.1】计算两数之和。6《C语言程序设计》第2章数据类型及其运算源程序:#include<stdio.h>intmain(){

intm,n,sum; m=32; n=64; sum=m+n;

printf("sum=%d\n",sum); return0;}2.1变量2.1.2变量的基本概念1.变量定义源程序中:intm,n,sum;1行定义了3个用于存放整数的整型变量。int

表示整型数据类型。7《C语言程序设计》第2章数据类型及其运算《C语言程序设计》第2章数据类型及其运算8图2-2定义变量后内存空间示意图2.1变量2.1.2变量的基本概念2.变量赋值源程序中:m=32;n=64;2行为变量赋值。将“=”右边的常量值赋给左边的变量。9《C语言程序设计》第2章数据类型及其运算《C语言程序设计》第2章数据类型及其运算10图2-3变量赋值后内存空间示意图2.1变量2.1.2变量的基本概念3.运算并保存结果源程序中:sum=m+n;1行为计算m+n的值赋值给变量sum。11《C语言程序设计》第2章数据类型及其运算《C语言程序设计》第2章数据类型及其运算图2-4保存运算结果后内存空间示意图2.1变量2.1.2变量的基本概念4.显示结果源程序中:printf("sum=%d\n",sum);1行在屏幕上显示运算结果。运行结果:13《C语言程序设计》第2章数据类型及其运算sum=962.1变量2.1.2变量的基本概念4.显示结果

printf()函数调用中"sum=%d\n"称为格式控制。格式控制中除了%号开始加后面的字符(例如本例中的“%d”)外,其余字符按原样输出。由“%”字符开始的称为格式说明,例如“%d”表示这里以有符号数十进制形式输出一个整数,这个整数是格式控制"sum=%d\n"后面跟着的常量、变量或表达式的值,具体到本例就是"sum=%d\n"后面的变量sum的值。14《C语言程序设计》第2章数据类型及其运算2.1变量2.1.3变量定义在C语言中,变量的必须遵循“先定义,后使用”的原则。变量定义的格式:

数据类型变量1[,变量2,…,变量n];注:这里[]表示可选项。例如,例2.1中的语句“intm,n,sum;”。15《C语言程序设计》第2章数据类型及其运算2.1变量2.1.3变量定义每个变量必须有一个类型,如整型、字符型等,它指明给这个变量分配多大的存储空间;每个变量还必须有一个名字,如x,y等,指明具体的变量名字。变量命名遵循标识符命名规则,习惯上,变量名用小写字母表示,以增加可读性。一般情况下变量应该先赋值再参与运算。一个变量的数值保存在该变量的存储空间内,程序通过变量名可以引用变量值。16《C语言程序设计》第2章数据类型及其运算2.1变量2.1.4变量的命名规则--标识符与关键字C语言中的变量命名符合标识符的命名规则。1.关键字关键字又称保留字,是C语言中预先规定的具有固定含义的一些单词,已被C语言编辑工具本身使用,不能被程序员另作其他用途。C语言共有32个关键字。2.标识符(标记和识别对象的符号)标识符是指用来标识变量名、符号常量名、函数名、数组名、类型名等有效的字符序列。17《C语言程序设计》第2章数据类型及其运算2.1变量2.1.4变量的命名规则--标识符与关键字C语言规定:标识符只能由字母、数字、下划线组成,并且只能由字母、下划线开头,不能是关键字。

如:abc、a12、x是合法的标识符,abc$、12a、x+y、int不是合法的标识符。18《C语言程序设计》第2章数据类型及其运算2.1变量2.1.4变量的命名规则--标识符与关键字使用标识符时要注意:(1)C语言对英文字母的大小写敏感,即同一字母的大小写被认为是两个不同的字符。例如,total与TOTAL是不同的标识符。(2)标识符的命名最好是见名知意。即通过标识符就知道其所表示的含义。通常应选择能表示数据含义的英文单词(或缩写)作标识符,或以汉语拼音字头作标识符。例如:name/xm(姓名)、sex/xb(性别)、age/nl(年龄)、salary/gz(工资)。(3)标识符的有效长度随系统而异,如果超长,则超长部分被舍弃。19《C语言程序设计》第2章数据类型及其运算2.1变量2.1.5变量的赋值与使用1.变量的赋值变量的值可以通过赋值表达式改变。

例如,例2.1中的赋值表达式“m=32”。实际上,变量在定义后其值是不确定的,因此在使用前应该先赋值,然后使用。变量的首次赋值可以称为变量的初始化。

变量的初始化除了可以采用例2.1中所用的方式外,还可以在定义的同时进行初始化。20《C语言程序设计》第2章数据类型及其运算2.1变量【例2.2】计算两数之和。21《C语言程序设计》第2章数据类型及其运算源程序:#include<stdio.h>intmain(){

intm=32,n=64,sum; sum=m+n;

printf("sum=%d\n",sum); return0;}运行结果:sum=962.1变量2.1.5变量的赋值与使用2.变量的使用变量可以参与运算,也可以保存运算结果。

例如,例2.2中的“sum=m+n;”语句,m,n是加法的两个加数,sum用于存放运算结果。23《C语言程序设计》第2章数据类型及其运算2.2常量在程序运行时,其值不能被改变的量叫常量。在C语言中也可以用一个标识符代表一个常量,这种标识符称为符号常量,即标识符形式的常量,一般用大写字母。例如,用PI表示3.14159。24《C语言程序设计》第2章数据类型及其运算2.2常量【例2.3】常量的应用。25《C语言程序设计》第2章数据类型及其运算源程序:#include<stdio.h>intmain(){

printf("%d\n",1000); return0;}说明:源程序中的1000即为常量。运行结果:10002.2常量【例2.4】符号常量的使用。27《C语言程序设计》第2章数据类型及其运算total=300源程序:#include<stdio.h>#definePRICE30intmain(){intnum,total;num=10;total=num*PRICE;printf("total=%d\n",total);return0;}说明:程序中用“#definePRICE30”命令行定义PRICE代表常量30,此后凡在此源程序中出现的PRICE在预编译阶段均被30替换。运行结果:2.2常量使用符号常量的优点:(1)含义清楚。

例如,用PRICE代表价格,看程序时从PRICE就可知道它代表价格。在一个规范的程序中不提倡使用太多常数,应尽量使用“见名知意”的符号常量。(2)需要改变一个常量的值时能做到“一改全改”。

例如,在程序中多处用到某物品的价格,如果价格用常数表示,则在价格调整时,就需要在程序中作多处修改,若用符号常量PRICE代表价格,只需改动一处即可。注意:“#define”是预处理命令,不要以“;”号结束。29《C语言程序设计》第2章数据类型及其运算2.3C语言的数据类型在C语言中所使用的每个数据都具有一个明确的数据类型。不同类型的数据在数据表示形式、合法的取值范围、占用内存空间大小及可以参与的运算种类等方面有所不同。C语言提供的数据类型分类见表“表2-2C语言的数据类型”。本章将主要介绍基本类型,包括整型、实型和字符型,其他类型的数据将在后续章节做详细的介绍。30《C语言程序设计》第2章数据类型及其运算数据类型分类关键字基本类型整型基本整型int长整型long短整型short无符号整型unsigned实型(浮点型)单精度实型float双精度实型double字符型char枚举类型enum无类型void构造类型数组[]指针类型*结构体struct共用体union表2-2C语言的数据类型2.3.1整型1.整型常量整型常量,即整常数。C语言中整常数可用以下三种形式表示。(1)十进制整数。十进制整型常量直接用数字表示,例如:5、100、0、-10等。(2)八进制整数。以0开头的数是八进制数。例如:05、0100等。(3)十六进制整数。以0x或0X开头的数是十六进制数。例如:0x5、0x1A0等。32《C语言程序设计》第2章数据类型及其运算2.3.1整型【例2.5】八进制与十六进制数。33《C语言程序设计》第2章数据类型及其运算源程序:#include<stdio.h>intmain(){

inta=0123,b=0x123

printf("a=%d,b=%d\n",a,b); return0;}运行结果:a=83,b=2912.3.1整型2.整型变量(1)整型变量可分为有符号和无符号型两大类。这两类又分为基本型、短整型和长整型三类。有符号整型变量的存储单元存储的是对应数值的补码。有符号型中又分为有符号整型、有符号短整型和有符号长整型,分别以signedint,signedshortint,signedlongint表示。35《C语言程序设计》第2章数据类型及其运算2.3.1整型2.整型变量无符号型整型变量的存储单元中全部二进位都用作存数值,不包括符号。无符号型中又分为无符号整型、无符号短整型和无符号长整型,分别以unsignedint,unsignedshortint,unsignedlongint表示。无符号型变量只能存放不带符号的整数,如123、4687等,而不能存放负数,如-123、-3。36《C语言程序设计》第2章数据类型及其运算2.3.1整型2.整型变量上述各类型整型变量占用的内存字节数,随系统而异。在16位操作系统中(例如TC环境下),一般用2字节表示一个int型变量,long型4个字节、short型2个字节。在32位操作系统中(例如VC环境下),一般用4字节表示一个int型变量,long型4个字节、short型2个字节。显然,不同类型的整型变量,其值域不同。37《C语言程序设计》第2章数据类型及其运算2.3.1整型2.整型变量n位有符号整数的取值范围是:-2n-1~2n-1-1。因此2个字节的有符号整型的取值范围是-215(-32768)~215-1(32767);4个字节的有符号整型的取值范围是-231(-2147483648)~231-1(2147483647)。n位无符号整数的取值范围是:0~2n-1。因此2个字节的有符号整型的取值范围是0~216-1(65535);4个字节的有符号整型的取值范围是0~232-1(4294967295)。38《C语言程序设计》第2章数据类型及其运算《C语言程序设计》第2章数据类型及其运算39类型符号关键字位数字节数数的表示范围整型有[signed]int324-2147483648~2147483647[signed]short[int]162-32768~32767[signed]long[int]324-2147483648~2147483647无unsigned[int]3240~4294967295unsignedshort[int]1620~65535unsignedlong[int]3240~4294967295表2-3VC的整型数据注意:方括号内为可选项。例如:有符号短整型可以表示为signedshortint、shortint、signedshort或short。2.3.1整型2.整型变量(2)整型变量的定义。C语言规定在程序中所有用到的变量都必须在程序中指定其类型,即“定义”。例如:

inta,b;/*指定变量a,b为整型*/unsignedshortc,d;/*指定变量c,d为无符号短整型*/longe,f;/*指定变量e,f为长整型*/注意:变量的定义,一般是放在一个函数的开头部分。40《C语言程序设计》第2章数据类型及其运算2.3.1整型【例2.6】整型变量的定义与使用。41《C语言程序设计》第2章数据类型及其运算源程序:#include<stdio.h>intmain(){

inta; unsignedb; a=-20; b=40;

printf("a=%d,b=%u\n",a,b); return0;}注意:printf()调用中的“%u”表示按无符号十进制整型输出。运行结果:a=-20,b=402.3.1整型3.整型常量的类型前面讨论了整型变量的类别。实际上整型常量也是有类别的。在将一个整型常量赋值给上述几种类别的整型变量时要注意类型匹配。(1)一个整数值在-32768~+32767范围内,可以赋值给2个字节或4个字节的整型变量。(2)一个整数值超过了-32768~+32767范围,而在-2147483648~2147483647范围内,可以赋值给4个字节的整型变量。如果赋值给2个字节的整型变量将发生溢出错误。43《C语言程序设计》第2章数据类型及其运算2.3.1整型3.整型常量的类型(3)如果一个C语言系统的shortint

与int型数据在内存中占据字节数相同,则二者的范围也相同。(4)一个常量后面加一个字母u或U表示为unsigned型常量。例如,24u表示无符号整型常量。注意:一个非负值的整常量可以赋值给unsigned型整变量,只要它的范围不超过变量的表示范围即可。例如,将50000赋给一个unsignedshortint型变量是可以的,而将70000赋给它是不行的,会发生溢出错误。44《C语言程序设计》第2章数据类型及其运算2.3.1整型3.整型常量的类型(5)在一个整常量后面加一个字母l或L则认为是1ongint型常量。例如:123l、432L,这往往用于函数调用中。45《C语言程序设计》第2章数据类型及其运算2.3.2浮点型1.实型常量实型常量即实数,在C语言中又称浮点数,实型常量有两种表达形式:(1)十进制数形式:由数字和小数点组成。例如:3.14、9.8、.135等。注意:小数形式表示的实型常量必须要有小数点。(2)指数形式:尾数E(e)整型指数。例如:3.0E+5、123e3等。注意:字母E(或e)之前是十进制数形式的实数,之后是整数,二者都不可缺少。例如:e5、2.1e2.7、e等都不是合法的指数形式。46《C语言程序设计》第2章数据类型及其运算2.3.2浮点型2.实型变量C语言中实型变量分为单精度(float型)和双精度(double型)两类,每一个实型变量都应在使用前加以定义。例如:floatx,y;/*指定x,y为单精度实数*/doublez;/*指定z为双精度实数*/47《C语言程序设计》第2章数据类型及其运算2.3.2浮点型2.实型变量在一般系统中,一个float型数据在内存中占4个字节,一个double型数据占8个字节。单精度实数的数值范围约为-1038~1038,双精度实数范围约为-10308~10308。单精度实数提供7位有效数字,双精度实数提供15~16位有效数字。实型常量不分float型和double型(很多C编译系统将实型常量作为双精度数来处理),一个实型常量,可以赋给一个实型变量(float型或double型),当然,这里要注意不要发生溢出错误。在实型常量后加字母f或F,表示它是float型。48《C语言程序设计》第2章数据类型及其运算2.3.2浮点型2.实型变量实型数据与整型数据的处理有所不同,整型数据是可以精确存储的,而实型数据通常无法精确存储。实型常量会根据变量的类型截取相应的有效位数字,因此要注意精度问题。49《C语言程序设计》第2章数据类型及其运算2.3.2浮点型2.实型变量例如,以下程序段输出的结果为“a=111111.109375,b=111111.111000”。这是由于a为float型变量只能接收7位有效数字,因此最后两位小数不起作用。而b为double型,则能全部接收全部9位数字。floata=111111.111;doubleb=111111.111;

printf("a=%f,b=%lf\n",a,b)注意:printf()调用中的“%f”和“%lf”分别表示按单精度实型和双精度实型输出后面的变量的值。50《C语言程序设计》第2章数据类型及其运算《C语言程序设计》第2章数据类型及其运算51类型符号关键字所占位数字节数数的表示范围实型有float324-3.4e-38~3.4e38有double648-1.7e-308~1.7e308表2-4VC的实型数据2.3.3字符型1.字符常量C语言中的字符常量是用单引号括起来的一个字符,例如,'A'、'b'、'1'、'+'、'?'、'$'等都是字符常量。字符常量实质上就是字符对应的ASCII码的值。例如,'A'实际上就是65。除了以上形式的字符常量外,C还允许用一种特殊形式的字符常量,就是以一个“\”开头的字符序列,例如,前面已经遇到过的,在printf()函数中的'\n',它代表一个“换行”符。反斜杠引导的字符称为转义字符,其意思是将反斜杠(\)后面的字符变成另外的意思。如果字符常量是反斜杠或单引号本身,必须使用转义字符:'\\'、'\'’表示。52《C语言程序设计》第2章数据类型及其运算《C语言程序设计》第2章数据类型及其运算53转义字符含义转义字符含义\n换行\t水平制表\v垂直制表\b退格\r回车\f换页\a响铃\\反斜线\'单引号\"双引号\ddd1~3位8进制数代表的字符\xhh1~2位16进制数代表的字符表2-5转义字符及其含义注:‘\ddd’和’\xhh’是用ASCII码(八进制数、十六进制数)表示的一个字符。例如,‘\101’代表字符‘A’、‘\012’代表“换行”。这种方法可以表示ASCII码码表中的所有字符。2.3.3字符型【例2.7】转义字符的应用。54《C语言程序设计》第2章数据类型及其运算源程序:#include<stdio.h>intmain(){ printf("\101\x42C\n");

printf("Isay:\"Howareyou?\"\n");

printf("\\CProgram\\\n");

printf("Turbo\'C\'\n"); return0;}注意:printf()调用中的“%u”表示按无符号十进制整型输出。运行结果:ABCIsay:"Howareyou?"\CProgram\Turbo'C'2.3.3字符型【例2.8】转义字符的应用。56《C语言程序设计》第2章数据类型及其运算源程序:#include<stdio.h>intmain(){

printf("Y\b=\n"); return0;}注意:printf()调用中的“%u”表示按无符号十进制整型输出。运行结果:程序分析:实际上,程序输出了字符“Y”,只是字符“Y”很快被后面字符“\b”回退一格所替代,因此屏幕上看不到字符“Y”。=2.3.3字符型2.字符变量字符型变量用来存储字符常量。将一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值存储到内存单元中。字符变量的定义形式如下:charc1,c2;它表示c1和c2为字符型变量,分别可以用于存放一个字符,因此可以用下面语句对c1、c2赋值:c1='a';c2='b';58《C语言程序设计》第2章数据类型及其运算2.3.3字符型2.字符变量一般以一个字节来存放一个字符,或者说一个字符变量在内存中占一个字节。字符数据在内存中是以ASCII码的值来存储的,它的存储形式与整数的存储形式相类似。在C语言中,字符型数据和整型数据之间可以相互通用。一个字符数据既可以以字符形式输出,也可以以整数形式输出。以字符形式输出时,需要先将存储单元中数值根据ASCII码码表换成相应字符进行输出。以整数形式输出时,直接将存储单元中的数值进行输出。59《C语言程序设计》第2章数据类型及其运算2.3.3字符型【例2.9】字符变量分别以字符形式和整数形式输出。60《C语言程序设计》第2章数据类型及其运算源程序:#include<stdio.h>intmain(){ charch1,ch2; ch1='a'; ch2='b';

printf("ch1=%c,ch2=%c\n",ch1,ch2);

printf("ch1=%d,ch2=%d\n",ch1,ch2); return0;}运行结果:程序分析:因为'a'和'b'的ASCII码值为97和98。c1='a'和c2='b'是先将字符常量'a'和'b'转换为字符所对应的ASCII码值97和98,然后存放到内存单元中。“%c”表示将存储单元的数值根据ASCII码码表换成相应字符进行输出。“%d”表示将存储单元的数值按十进制数进行输出。ch1=a,ch2=bch1=97,ch2=982.3.3字符型2.字符变量字符数据与整型数据可以互相赋值。例如:

inti;charc;i='a';c=97;上述赋值是合法的。如果将i的值输出得到97,如按字符形式输出c可得字符'a'。C程序允许对字符数据进行算术运算,此时就是对它们的ASCII码值进行算术运算。62《C语言程序设计》第2章数据类型及其运算2.3.3字符型【例2.10】字符数据的算术运算。63《C语言程序设计》第2章数据类型及其运算源程序:#include<stdio.h>intmain(){charch1,ch2;ch1='a';ch2='B';printf("ch1=%c,ch2=%c\n",ch1–32,ch2+32)printf("ch1+ch2=%d\n",ch1+ch2);return0;}运行结果:ch1=A,ch2=bch1+ch2=1632.3.3字符型3.字符串常量字符串常量是用一对双引号括起来的若干字符序列。字符串中字符的个数称为字符串长度。例如,"Howdoyoudo."、"Goodmorning."等,都是字符串常量,其长度分别为14和13(空格也是一个字符)。长度为0的字符串(即一个字符都没有的字符串)称为空串。65《C语言程序设计》第2章数据类型及其运算2.3.3字符型3.字符串常量如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。例如:(1)字符串C:\windows对应的字符串常量表示为"C:\\windows"(2)字符串Isay:"Goodbye!"对应的字符串常量表示为"Isay:\"Goodbye!\""66《C语言程序设计》第2章数据类型及其运算2.3.3字符型3.字符串常量不要将字符常量与字符串常量混淆,二者是完全不同的概念。字符常量使用单引号,而字符串常量使用双引号。'a'是字符常量,"a"是字符串常量,两者不同。假设c被指定为字符变量:charc;c='a';是正确的。而

c="a";是错误的。67《C语言程序设计》第2章数据类型及其运算2.3.3字符型3.字符串常量在C语言中,每一个字符串的结尾包含一个“字符串结束标志”,以便系统据此判断字符串是否结束。C语言以字符'\0'作为字符串结束标志。'\0'是一个ASCII码值为0的字符。空串""实际在内存中占有一个字节,即包含一个字符'\0'。68《C语言程序设计》第2章数据类型及其运算2.3.3字符型3.字符串常量例如:字符串"hello"内存中它占6个字节,最后一个字节为'\0':例如,在printf("Howdoyoudo.")中,输出时一个一个字符输出,直到遇到最后的'\0'字符,就知道字符串结束,停止输出。注意,在写字符串时不必加'\0',否则画蛇添足。'\0'字符是系统自动加上的。69《C语言程序设计》第2章数据类型及其运算hello\02.3.3字符型3.字符串常量字符串"a",实际上包含2个字符:'a'和'\0',因此,把它赋给一个字符变量是错误的。严格的说,在C语言中字符串只有常量,没有变量,而且字符串不是一种数据类型。在C语言中字符串如果需要按变量的方式进行处理,需要用字符数组来存放,即用一个字符型数组来存放一个字符串。70《C语言程序设计》第2章数据类型及其运算2.3.4类型转换在C语言中,整型、实型和字符型数据间可以混合运算。如果一个运算符两侧的操作数的数据类型不同,则系统按“先转换、后运算”的原则,首先将数据自动转换成同一类型,然后在同一类型数据间进行运算。类型转换有自动进行的,也有强制执行的。前者称为隐式类型转换,后者称为强制类型转换。71《C语言程序设计》第2章数据类型及其运算2.3.4类型转换1.隐式类型转换隐式类型转换主要又可分为两类:算术转换和赋值转换。(1)算术转换:算术转换主要出现在算术运算过程中,转换规则如图2-5所示。72《C语言程序设计》第2章数据类型及其运算《C语言程序设计》第2章数据类型及其运算73图2-5算术运算中的类型转换规则2.3.4类型转换说明:(1)图中横向向左的箭头表示必定进行的转换,也就是说系统会先将char型数据转换为int型行数据、short型数据先转换为int型数据、float型数据转换为double型数据,然后进行运算。例如,当两个float型数据做加法运算时系统首先将2个加数换成双精度型然后再相加以提高运算精度。74《C语言程序设计》第2章数据类型及其运算2.3.4类型转换说明:(2)纵向的箭头表示当运算对象为不同类型时转换的方向。例如,int型与double型数据进行运算,先将int型的数据转换成double型,然后两个同类型(double型)数据进行运算,结果为double型。75《C语言程序设计》第2章数据类型及其运算2.3.4类型转换注意:箭头方向只表示数据类型级别的高低,由低向高转换,不要理解为int型先转换成unsigned型,再转换成long型,再转换成double型。如果一个int型数据与一个double型数据运算,是直接将int型转换成double型。同理,一个int型与一个long型数据运算,先将int型转直接换成long型。76《C语言程序设计》第2章数据类型及其运算2.3.4类型转换假设定义ch为字符型变量,i为整型变量,f为float型变量,d为double型变量,则下式:

ch/i+f*d–(f+i)运算过程如图示。77《C语言程序设计》第2章数据类型及其运算2.3.4类型转换(2)赋值转换:赋值转换主要出现在赋值表达式中,不管赋值运算符右边是什么类型,都要转换为赋值运算符左边的变量类型。若赋值运算符右边的值大于左边变量的表示范围,则赋值时会发生溢出错误。78《C语言程序设计》第2章数据类型及其运算2.3.4类型转换2.强制类型转换C语言提供了强制类型转换运算符来实现强制类型转换。语法格式:(类型)表达式例如:(int)3.579《C语言程序设计》第2章数据类型及其运算2.3.4类型转换2.强制类型转换如果一个变量在进行运算时进行了强制类型转换,使用强制转换类型得到的是一个所需类型的中间量,变量本身的类型及数值都不会发生变化。例如:

intx=5;floaty=3.5;x=x+(int)yy的值是3.5,在进行加法运算时强制转换为int型、值为3参与运算。运算结束后,y仍然是float型,其值仍然是3.5。80《C语言程序设计》第2章数据类型及其运算2.3.5选择正确的数据类型在进行C语言程序设计过程中正确选择数据类型是非常重要的,下面以2道例题进行说明。81《C语言程序设计》第2章数据类型及其运算2.3.5选择正确的数据类型【例2.11】整型数据的溢出。82《C语言程序设计》第2章数据类型及其运算源程序:#include<stdio.h>intmain(){

inta,b; a=32767; b=a+1;

printf("a=%d,b=%d\n",a,b); return0;}在TC环境下的运行结果:

在VC环境下的运行结果:a=32767,b=-32768a=32767,b=327682.3.5选择正确的数据类型程序分析:TC环境是一个16位的开发环境,int类型的变量是用2个字节存放采用补码进行编码的有符号数。2个字节的补码的表示范围为-32768~32767。32767加1后产生溢出。实际上32767的补码为0111111111111111B,加1后变为,1000000000000000B,这是-32768的补码,所以变量b输出的值为-32768。VC环境是一个32位的开发环境,int是用4个字节存放采用补码进行编码的有符号数。4个字节的补码的表示范围为-2147483648~2147483647。32767加1后不会产生溢出。84《C语言程序设计》第2章数据类型及其运算在TC环境下将程序修改为:#include<stdio.h>intmain(){ longinta,b; a=32767; b=a+1;

printf("a=%ld,b=%ld\n",a,b); return0;}注意:printf()函数调用中的“%ld”表示按长整型输出后面变量的值。运行结果:a=32767,b=327682.3.5选择正确的数据类型【例2.12】华氏温度到摄氏温度的转换。转换公式为:

式中:f代表华氏温度,c代表摄氏温度。86《C语言程序设计》第2章数据类型及其运算源程序:#include<stdio.h>intmain(){ floatf,c; f=64.0; c=(5/9)*(f–32);

printf("f=%f\nc=%f\n",f,c); return0;}式中printf()函数调用中“%f”表示按实数形式输出数据。运行结果:f=64.000000c=0.0000002.3.5选择正确的数据类型结果分析:“c=0.000000”显然是错误的。“/”是除法运算,如果被除数和除数都是整数,则其结果也是整除(小数部分被舍去)。因为5和9都是整型常量,所以“5/9”的结果是0。如果要获得正确结果,只需要将程序中的整型常量“5”改为实型常量“5.0”即可。修改后的运行结果:88《C语言程序设计》第2章数据类型及其运算f=64.000000c=17.7777782.3.6sizeof运算符sizeof是C语言的一种单目运算符,sizeof运算符以字节形式给出了其操作数的存储空间大小。可以利用sizeof运算符判断数据类型的字节长度。使用方法:

sizeof(类型说明符);注意:sizeof不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行过程中才计算出来。89《C语言程序设计》第2章数据类型及其运算2.3.6sizeof运算符【例2.13】确定整型数据类型的字节长度。90《C语言程序设计》第2章数据类型及其运算源程序:#include<stdio.h>intmain(){

printf("%d,%d,%d\n",sizeof(short

int),

sizeof(int),sizeof(long

int)); return0;}在TC(16位系统)环境下的运行结果:

在VC(32位系统)环境下的运行结果:

程序分析:在TC中,int变量占2个字节;在VC中,int变量占4个字节。2,2,42,4,42.4运算符与表达式运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言的运算范围很宽,除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。运算符主要分为三大类:算术运算符、关系运算符与逻辑运算符。除此之外,还有一些用于完成特殊任务的运算符。运算符、常量和变量构成C语言的表达式。92《C语言程序设计》第2章数据类型及其运算2.4.1运算符的优先级与结合性C语言规定了运算符的优先级和结合性。C语言中运算符的优先级共分为15级,1级最高,15级最低。在表达式中,一个操作数两侧的运算符优先级不同时,先进行优先级较高的运算;两侧的运算符优先级相同时,按运算符的结合性所规定的结合方向处理。93《C语言程序设计》第2章数据类型及其运算2.4.1运算符的优先级与结合性所谓结合性是指,当一个操作数两侧的运算符具有相同优先级时该操作数是先与左边的运算符结合,还是先与右边的运算符结合。自左至右的结合方向,称为左结合性。反之,称为右结合性。例如,算术运算符的结合性是左结合性,因此,表达式“x-y+z”先执行“x-y”运算,然后再执行“+z”运算。再如赋值运算符的结合性是右结合性,因此,表达式“x=y=z”先执行“y=z”运算,然后再执行变量x的赋值运算。94《C语言程序设计》第2章数据类型及其运算2.4.2算术运算符和算术表达式1.算术运算符算术运算符有五种,如表2-6所示。95《C语言程序设计》第2章数据类型及其运算96《C语言程序设计》第2章数据类型及其运算+加法运算符,如3+6正值运算符,如+2-减法运算符,如6-3负值运算符,如-2*乘法运算符,如3*6/除法运算符,如6/3%求余运算符(或称模运算符),如7%4表2-6五种基本算术运算符2.4.2算术运算符和算术表达式注意:(1)运算符“%”只用于整型(包括字符型,实际上字符型可以看作是1个字节的整型),它的两侧都必须是整型操作数。如果不是整型数,必须将操作数强制转换成整型再进行求余运算,否则将出现编译错误。(2)若操作数中有负值,求余的原则为:先取绝对值求余数,余数的符号取被除数的符号。例如:-10%3的结果为-1;10%-3的结果为1,即采取“向零取整”的方法。97《C语言程序设计》第2章数据类型及其运算2.4.2算术运算符和算术表达式2.算术运算符的优先级与结合性算术运算符的优先级:先乘除、后加减;括号优先。算术运算符的结合性:左结合性。98《C语言程序设计》第2章数据类型及其运算2.4.2算术运算符和算术表达式3.算术表达式算术表达式是指用算术运算符和括号将运算对象(也称操作数,如常量、变量、函数等)连接起来,符合C语法规则的式子。例如:

a+b*c+d

根据算术运算符的优先级与结合性,算术表达式“a+b*c+d”等效为“(a+(b*c))+d”。99《C语言程序设计》第2章数据类型及其运算2.4.2算术运算符和算术表达式4.自增运算符和自减运算符(1)自增运算符

自增运算符(++)是单目运算符,其作用使单个变量的值增1。自增运算符有两种使用情况:1)前置:++i。先执行i=i+1,再使用i值;2)后置:i++。先使用i值,再执行i=i+1。100《C语言程序设计》第2章数据类型及其运算2.4.2算术运算符和算术表达式例如:j=3; k=++j;

执行“k=++j”语句后,k=4,j=4。上述语句等效为:j=3; j=j+1; k=j;再如:j=3; k=j++;

执行“k=j++;”语句后,k=3,j=4。上述语句等效为:j=3; k=j; j=j+1;101《C语言程序设计》第2章数据类型及其运算2.4.2算术运算符和算术表达式(2)自减运算符

自减运算符(--)也是单目运算符,其作用使单个变量的值减1。自减运算符种类也有两种使用情况:前置:--i。先执行i=i-1,再使用i值;后置:i--。先使用i值,再执行i=i-1。102《C语言程序设计》第2章数据类型及其运算2.4.2算术运算符和算术表达式例如:j=3; k=--j;

执行“k=--j;”语句后,k=2,j=2。上述语句等效为:j=3; j=j-1; k=j;再如:j=3; k=j--;

执行“k=j--;”语句后,k=3,j=2。上述语句等效为:j=3; k=j; j=j-1103《C语言程序设计》第2章数据类型及其运算2.4.2算术运算符和算术表达式说明:①自增运算符(++)、自减运算符(--),只能用于变量,不能用于常量和表达式。

例如,5++、--(a+b)等都是非法的。因为5是常量,常量的值不能改变。(a+b)++也不可能实现,假如a+b的值为5,那么自增后得到的6放在什么地方呢?无变量可供存放。104《C语言程序设计》第2章数据类型及其运算2.4.2算术运算符和算术表达式说明:②++和--的结合方向是“自右至左”,其优先级高于算术运算符。

例如,i=3,-i++相当于-(i++),因此表达式的值为-3,i=4。③自增运算符、自减运算符,常用于循环语句中,使循环控制变量加(或减)1,以及指针变量中,使指针指向下(或上)一个地址。105《C语言程序设计》第2章数据类型及其运算2.4.3赋值运算符和赋值表达式1.赋值运算符赋值运算符“=”的作用是将一个数据赋给一个变量。语法格式:

变量=表达式功能:将“=”右侧的常量或表达式计算所得的值赋给左侧的变量。例如,“x=5”的作用是执行一次赋值操作,将常量5赋给变量x。106《C语言程序设计》第2章数据类型及其运算2.4.3赋值运算符和赋值表达式2.复合赋值运算符在赋值符“=”之前加上其他双目运算符,可以构成复合赋值运算符。语法格式:

变量双目运算符=表达式其中“双目运算符=”就是复合赋值运算符。它等价于:变量=变量双目运算符表达式107《C语言程序设计》第2章数据类型及其运算2.4.3赋值运算符和赋值表达式例如:a+=3等价于a=a+3x%=3等价于x=x%3x*=y+8等价于x=x*(y+8)/*注意:“+”的优先级高于“*=”*/C语言规定的10种复合赋值运算符如下:+=,-=,*=,/=,%=;/*复合算术运算符5个*/&=,^=,|=,<<=,>>=。/*复合位运算符5个*/108《C语言程序设计》第2章数据类型及其运算2.4.3赋值运算符和赋值表达式3.赋值运算符的优先级与结合性赋值运算符和复合赋值运算符的优先级为14级,在所有C语言的运算符中仅高于逗号运算符。赋值运算符和复合赋值运算符的结合性:右结合性。109《C语言程序设计》第2章数据类型及其运算2.4.3赋值运算符和赋值表达式4.赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。语法格式:变量赋值运算符/复合赋值运算符表达式例如:“a=5”、“a+=5”都是赋值表达式。赋值表达式的求解过程:将赋值运算符右侧的“表达式”的值赋给左侧的变量。110《C语言程序设计》第2章数据类型及其运算2.4.3赋值运算符和赋值表达式4.赋值表达式赋值表达式的值:赋值运算结束后,赋值表达式左侧变量的值就是赋值表达式的值。例如,赋值表达式“a=5”的值为5(变量a的值也是5)。例如,根据赋值运算符的结合性,表达式“a=b=10”等价于“a=(b=10)”,即先将常量10赋给变量b,赋值表达式“b=10”的值为10,再将赋值表达式“b=10”的值(10)赋给变量a。111《C语言程序设计》第2章数据类型及其运算2.4.3赋值运算符和赋值表达式在C语言中,赋值表达式可以出现在其它表达式中参与运算。例如,加法表达式“(b=4)+(c=6)”。执行该表达式后:b等于4;c等于6;表达式的值为10。将赋值运算作为一种表达式,使赋值操作不仅可以构成赋值语句,而且可以出现在其它表达式中,这是C语言灵活性的一种表现。112《C语言程序设计》第2章数据类型及其运算2.4.3赋值运算符和赋值表达式下面是一些赋值表达式的例子:a=b=c=5 (表达式值为5,a、b、c值均为5)a=5+(c=6) (表达式值为11,a值为11,c的值为6)a=(b=4)+(c=6) (表达式值为10,a值为10,b值为4,c值为6)a=(b=10)/(c=2) (表达式值为5,a值为5,b值为10,c值为2)113《C语言程序设计》第2章数据类型及其运算2.4.4关系运算符和关系表达式1.关系运算符所谓“关系运算”实际上就是“比较运算”,即将两个数据进行比较,判定两个数据是否符合给定的关系。例如,“a>b”中的“>”表示大于关系运算。如果a的值是5,b的值是3,则大于关系运算“>”的结果为“真”,即条件成立;如果a的值是2,b的值是3,则大于关系运算“>”的结果为“假”,即条件不成立。114《C语言程序设计》第2章数据类型及其运算2.4.4关系运算符和关系表达式C语言提供6种关系运算符:<(小于) <=(小于或等于) >(大于) >=(大于或等于)==(等于) !=(不等于)注意:在C语言中,“等于”关系运算符是双等号“==”,而不是单等号“=”。单等号“=”是赋值运算符。115《C语言程序设计》第2章数据类型及其运算2.4.4关系运算符和关系表达式关系运算符的优先级:(1)在关系运算符中,前4个优先级相同,后2个也相同,且前4个高于后2个。(2)关系运算符的优先级,低于算术运算符,高于赋值运算符。关系运算符的结合性:左结合性。116《C语言程序设计》第2章数据类型及其运算2.4.4关系运算符和关系表达式3.关系表达式关系表达式是指用关系运算符将两个表达式连接起来进行关系运算的式子。例如,下面的关系表达式都是合法的:a>b,a+b>c-d,(a=3)<=(b=5),'a'>='b',(a>b)==(b>c)关系运算的结果非“真”即“假”。在C语言中没有逻辑型数据,“逻辑真”用整数“1”表示,“逻辑假”用整数“0”表示。即关系表达式的值是1(真)或0(假)。关系表达式的值,还可以参与其他运算,例如算术运算、逻辑运算等。117《C语言程序设计》第2章数据类型及其运算2.4.4关系运算符和关系表达式下面是一些关系表达式的例子(假设num1=3,num2=4,num3=5):(1)num1>num2的值为0(假)。(2)(num1>num2)!=num3的值为1(真)。因为“num1>num2”的值为0,num3的值为5,二则不相等为真。(3)num1<num2<num3的值为1(真)。因为关系运算符为左结合性,先计算表达式“num1<num2”,其值为1,而num3的值为5,1<5为真。(4)(num1<num2)+num3的值为6。这是一个加法表达式,因为“num1<num2”的值为1,num3的值为5,1+5=6。(5)num3>num2>num1的值为0(假)。因为关系运算符为左结合性,先计算表达式“num3>num2”,其值为1,而num1的值为3,1>3为假。118《C语言程序设计》第2章数据类型及其运算2.4.5逻辑运算符和逻辑表达式1.逻辑运算符在C语言中有三种逻辑运算符:&&(逻辑与)、||(逻辑或)和!(逻辑非)。逻辑运算符的运算规则:(1)&&:当且仅当两个运算量的值都为“真”时,运算结果为1(真),否则为0(假)。(2)||:当且仅当两个运算量的值都为“假”时,运算结果为0(假),否则为1(真)。(3)!:当运算量的值为“真”时,运算结果为0(假);当运算量的值为“假”时,运算结果为1(真)。119《C语言程序设计》第2章数据类型及其运算2.4.5逻辑运算符和逻辑表达式注意:(1)关系表达式和逻辑表达式的运算结果都是1或0,用整数“1”表示“逻辑真”,用“0”表示“逻辑假”。(2)在C语言中,在判断一个数据表示的是“真”还是“假”时,是以0和非0为根据。如果数据为0,则表示“逻辑假”;如果为非0,则表示“逻辑真”。C语言中的逻辑运算如表2-7所示。120《C语言程序设计》第2章数据类型及其运算《C语言程序设计》第2章数据类型及其运算121变量a变量b非!a与a&&b或a||b非0非0011非000010非010100100表2-7C语言中的逻辑运算例如,!5的值为0。2.4.5逻辑运算符和逻辑表达式2.逻辑运算符的优先级与结合性(1)逻辑非的优先级最高,逻辑与次之,逻辑或最低。即由高到低依次为:!→&&→||。(2)逻辑运算符与其他种类运算符的优先级关系。由高到低依次为:!→算术运算→关系运算→&&→||→赋值运算。(3)逻辑运算符是左结合性。122《C语言程序设计》第2章数据类型及其运算2.4.5逻辑运算符和逻辑表达式3.逻辑表达式逻辑表达式是指用逻辑运算符将一个或多个表达式连接起来进行逻辑运算的式子。例如,下面的表达式都是逻辑表达式:(x>=0)&&(x<10)(x<1)||(x>5)!(x==0)(year%4==0)&&(year%100!=0)||(year%400==0)123《C语言程序设计》第2章数据类型及其运算2.4.5逻辑运算符和逻辑表达式说明:(1)逻辑运算符两侧的操作数,除可以是0和非0的整数外,也可以是其他任何类型的数据,如实型、字符型等。(2)在计算逻辑表达式时,只有在必须执行下一个表达式才能求解时,才求解该表达式。也就是说:对于逻辑与运算,如果第一个操作数被判定为“假”,系统不再判定或求解第二操作数;对于逻辑或运算,如果第一个操作数被判定为“真”,系统不再判定或求解第二操作数。124《C语言程序设计》第2章数据类型及其运算2.4.5逻辑运算符和逻辑表达式例如:

in

温馨提示

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

评论

0/150

提交评论