版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章数据类型、运算符及表达式2.1C语言的数据类型
2.2常量
2.3变量
2.4运算符与表达式
2.1C语言的数据类型
C语言有五种基本数据类型:字符型、整型、单精度实型、双精度实型和空类型。这五种类型数据的长度和取值范围随处理器的类型和C语言编译程序的实现而不同,整数与CPU字长相等,一个字符通常为一个字节,浮点值的确切格式则根据实际而定。
C语言还提供了几种聚合类型(AggregateTypes),包括数组、指针、结构、共用体(联合)、位域和枚举。除void类型外,基本类型的前面可以有各种修饰符。修饰符用来改变基本类型的意义,以便更准确地适应各种情况的需求。修饰符如下:
·signed(有符号)。
·unsigned(无符号)。
·long(长型符)。
·short(短型符)。
修饰符signed、unsigned和long、short适用于字符和整数两种基本类型,而long还可用于double(注意:由于longfloat与double意思相同,所以ANSI标准删除了多余的longfloat)。
2.2常量
2.2.1整型常量
整型常量,也叫整常数,可以有正负号。C语言整型常量可以用十进制整数、八进制整数和十六进制整数三种不同的形式表示。在每一种常量后加小写字母l或大写字母L又得到十进制长整型常量、八进制长整型常量和十六进制长整型常量。
1.十进制整型常量
用数码0~9表示的十进制整数。如215、-236、0等。
2.十进制长整型常量
在十进制整型常量后加小写字母l或大写字母L表示的数,如64L、65 783 l等都是十进制长整型常量。
3.八进制整型常量
以数字0开头、用数码0~7表示的整数,开头的数字0代表所表示的数为八进制数,以区别于十进制整型常量。如04、-016、0237等(分别代表十进制数4、-14、159)。
4.八进制长整型常量
在八进制整型常量后加小写字母l或大写字母L表示的数,如064L、065753l等都是八进制长整型常量。
5.十六进制整数
以数字0和小写字母x或大写字母X开头,用数码0~9或小写字母a~f或大写字母A~F表示的十六进制整数,0x代表所表示的数为十六进制数,如0x123、-0x1fa、0x64等(分别代表十进制数291、-506、100)。
6.十六进制长整数
在十六进制整型常量后加小写字母l或大写字母L表示的数,如0x64L、0x65753l等都是十六进制长整型常量。2.2.2实型常量
实型常量又称实数或浮点数。C语言实型常量只使用十进制,它有十进制形式和指数形式两种表示形式。
1.十进制形式
十进制形式由整数部分、小数点和小数部分组成。当整数部分为0或小数部分为0时整数部分或小数部分的0都可以省略。例如:3.14、10.8、124.、.13、0.0等都是十进制实数的表示形式,但这种表示形式不适合表示太小或太大的数。
2.指数形式
指数形式由尾数、大写字母E(或小写字母e)和整数指数组成。它适合表示比较小或比较大的数。字符E(或e)前必须有数字,且其后的指数必须为整数。例如:3.0E+5或3.0e+5都表示3.0×105,1.23E-2表示1.230×10-2或0.0123。
说明:实型常量不分float型和double型。如果实型常量跟有后缀f或F,则被当做float型,否则C语言编译系统总是将其处理成双精度型。一个实型常量可以赋给一个实型变量(float型或double型)。2.2.3字符型常量
1.定义
C语言中用一对单引号括起来的单个字符称为字符常量。例如 'a'、'A'、'1'、'+' 等,其中 'a'、'A' 是两个不同的字符常量。
在C语言中,字符常量的值就是该字符的ASCII代码,在内存中占一个字节。如c = 'A' 与c=65这两个赋值语句是相同的。
2.转义字符
C语言还有一种特殊形式的字符常量,就是以反斜杠“\”开头的转义字符,所谓转义字符,是指将反斜杠“\”后面的字符转变为另外一种含义。使用这种方法可以表示任何输出的字母字符、专用字符、控制字符和图形字符。见表2.1。表2.1转义字符及其功能表图2.1例2.1的运行结果程序说明:printf函数直接输出双引号内的普通字符please,然后遇到转义字符“\t”,其作用是横向跳到下一个输出区(每个输出区占8列),即在第9列输出字符H(因为please占了6列,所以第一个输出区还剩两列,H字符输出在第9列)。
3.字符常量
用单引号括起来的一个字符,如 'A'、'a'、'8'、'?'、'$' 等都是字符常量。2.2.4字符串常量
1.定义
字符串常量是用双引号括起来的零个、一个或多个字符序列,如 "Iamastudent"。编译程序自动地在每一个字符串末尾添加串结束符“\0”,因此,所需要的存储空间比字符串的字符个数多一个。
字符串中字符的个数称为字符串长度。长度为0的字符串(即一个字符都没有的字符串)称为空串,表示为 ""(一对紧连的双引号)。
如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。
2.字符串的存储
C语言规定:在存储字符串常量时,由系统在字符串的末尾自动加一个“\0”作为字符串的结束标志。
如果有一个字符串为“CHINA”,则它在内存中的实际存储如图2.2所示。图2.2字符串存储示意图该字符串实际占用内存空间是6个字节,最后一个字节是系统自动加上的字符串的结束符——\0。比如在执行语句printf("CHINA")时,字符一个一个地输出,直到遇上“\0”字符,就知道此字符串结束,输出停止,而且不会输出“\0”。值得注意的是:在源程序中书写字符串常量时,不需要加结束字符“\0”,否则画蛇添足。
提示:字符常量 'a' 与字符串常量 "a" 是两回事,两者有如下不同之处:
(1)定界符不同:字符常量使用单引号,而字符串常量使用双引号;
(2)长度不同:字符常量的长度固定为1,而字符串常量的长度指字符串包含的字符个数,可以是0,也可以是某个整数,"a" 的长度是1;
(3)存储要求不同:字符常量占用1个字节的存储空间,存储的是字符的ASCII码值,而字符串常量除了要存储有效的字符外,还要存储一个结束标志符“\0”,所以字符串常量要占用字符串长度 +1个字节,因此字符串常量 "a" 占用两个字节的存储空间。 2.3变量
顾名思义,其值可以改变的量称为变量。一个变量用一个名字来标识,此名字称为该变量的标识符(为了增加程序的易读性,应尽可能以有意义的名字来标识变量)。变量在内存中占据一定的存储单元,该存储单元有一个确定的地址,该存储单元存放变量的值,变量的值可以属于不同的类型。所以变量有变量名、变量的地址、变量的类型和变量的值四个要素。注意,变量名和变量值是两个不同的概念,变量名与内存中的某一存储单元即变量的地址相联系,程序中的变量经过编译后都被翻译为其存储单元的地址,而变量值是指存放在该存储单元中的某种类型的数据的值。同一个变量名对应的变量在不同的时刻可以有不同的值。如图2.3所示,对于变量a,它的存储单元是确定的,它在某一个时刻取值3,另一时刻取值5,实际上就是在不同的时刻在同一存储单元中存储了不同的值。图2.3不同时刻变量的存储单元存储不同的值在C语言中,夹在/**/中的内容表示注释,是对程序或语句添加的说明,注释在程序运行时并不执行,但必要的注释可提高程序的可读性,因此在编写程序的过程中,在适当的地方应该加上必要的注释。
上述变量被说明后,根据不同的类型,由编译程序分配不同大小的存储单元。2.3.2变量的初始化及分类
在定义变量时,给变量赋值称为变量的初始化。
如inta=5,b;在定义变量a和b的同时给变量a赋值为5,是对变量a进行初始化。
如inta,b;a=5;先定义两个整型变量a和b,然后给变量a赋值为5,就不是初始化。
虽然上面两例的执行效果相同,但前者是对变量a进行初始化,而后者是对变量a赋值。
变量按数据类型可分为整型变量、实型变量和字符变量三种。
1.整型变量
整型变量的基本类型符号为int。根据变量数值的取值范围不同,再加上特定的前缀,又派生出多种类型。
1)整型变量的分类
整型变量根据其占用内存字节数的不同分为以下三种类型:
(1)基本整型。类型关键字为int。
(2)短整型。类型关键字为short[int]。
(3)长整型。类型关键字为long[int]。
在上述三种类型前加上无符号整型标记unsigned,则只能用来存储无符号整数。于是又有下列类型的整型变量:
(1)无符号基本整型。类型关键字为unsignedint。
(2)无符号短整型。类型关键字为unsignedshort[int]。
(3)无符号长整型。类型关键字为unsignedlong[int]。
2)整型变量的值域
C语言中没有规定以上各种数据占有内存的字节数,只要求一个short型数据不长于一个int型数据,一个int型数据又不长于一个long型数据。具体实现由各计算机系统自行决定。表2.2列出了不同计算机上整型变量数据的取值范围。表2.2不同计算机上整型变量数据的取值范围
3)整型匹配规则
整型变量的类型匹配规则为:一个整型常量可以赋值给能容纳其值的整型变量。
例如:值在-32 768~32 867的整型数,可以赋值给int型变量和longint型变量,而值在-2 147 483 648~-327 687或327 688~2 147 483 647范围内的整型数,就只能赋给longint型变量。图2.4例2.2的运行结果在上例中我们定义了4个不同类型的整型变量,多个语句写在一行上是允许的(但是每一行写一个语句可以增加易读性),在输出语句中双引号内的%d、%ld、%u都是输出格式控制符,%d控制a,b按整型格式输出,%ld控制x按长整型格式输出,%u控制y按无符号整型格式输出。
注意:把一个整型值赋给上述几种类型的整型变量时类型要匹配,否则会出错。
2.实型变量
1)实型变量在内存中的存放情况
实型变量在内存中通常按指数形式存储,并分成小数部分和指数部分分别存放。小数部分采用规范化的指数方式表示。不同类型的实型变量所占存储空间不同,小数部分占位多少关系到数据的精度高低,占位越多则数据的有效位数越多,精度也就越高;指数部分占位越多,则可表示的数值范围越大。
2)实型变量的分类
C语言的实型变量分为以下三类:
(1)单精度型。用float表示,一般占4个字节(32bit)、提供6~7位有效数字,数据的取值范围是:-3.4×10-38~3.4×1038。例如:floatx,y;指定x和y为单精度实型变量。
(2)双精度型。用double表示,一般占8个字节(64bit)、提供15~16位有效数字,数据的取值范围是:-1.7×10-308~1.7×10308。例如doublea,c;指定a和c为双精度实型变量。
(3)长双精度型。用longdouble表示,一般占16个字节(128bit)、提供18~19位有效数字,数据的取值范围是:-1.2×10-4932~1.2×104932。长双精度型用得很少。图2.5例2.3的运行结果
3.字符变量
1)字符变量的定义
字符变量是用来存放字符常量的,一个字符变量只能放一个字符,而不是一个字符串。它的类型关键字为char,字符变量占用一个字节的内存单元。例如:
charc1,c2; /*定义两个字符变量:c1和c2*/
c1= 'a';c2= 'b'; /*给字符变量赋值*/
2)字符变量数据的存储形式及其使用特点
将一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值(无符号整数)存储到字符内存单元中。例如:'a' 的ASCII码值为97,在内存中变量c1的一个字节中存放01100001这样一个二进制数。因为字符数据在内存中存储的是字符的ASCII码值(无符号整数),其形式与整数的存储形式是一样的,因此C语言允许字符型数据与整型数据之间通用,并且允许对字符数据进行算术运算,这些都是通过对它们的ASCII码值进行算术运算来完成的。由程序运行结果可知,一个字符型数据,既可以以字符形式输出,也可以以整数形式输出。图2.6例2.4的运行结果 2.4运算符与表达式
2.4.1算术运算符及算术表达式
C语言规定的基本的算术运算符有:
(1)加法运算符或取正值运算符:+,如1+2、+2。
(2)减法运算符或取负值运算符:-,如2-1、-2。
(3)乘法运算符:*,如1*2。
(4)除法运算符:/,如5/2。C语言规定:两个整数相除,其商为整数,小数部分被舍弃(即舍尾取整),如5/2=2。如果操作数中有负数,取整通常采取“向零取整”的方法。如5/(-3)=-1。
(5)求余运算符,或称模运算符:%,运算符两边均要求是整数,否则出错,其结果是两个整数相除的余数,如9%5,结果为4。
表达式的概念:用运算符和括号将运算对象(常量、变量和函数等)连接起来组成符合C语言语法规则的式子称为表达式。
单个常量、变量或函数可以看做是表达式的一种特例。将单个常量、变量或函数构成的表达式称为简单表达式,其他表达式称为复杂表达式。
算术表达式的概念:当表达式中的运算符都是算术运算符时,此表达式即为算术表达式。例如:2+3和a*b-6%9+a/(x+y)等都是算术表达式。算术运算符的优先级和结合性如表2.3所示。所谓运算符优先级是指表达式中出现多个运算符时,运算符执行的先后次序,例如先乘除后加减。而所谓结合性是指当一个操作数两侧的运算符具有相同的优先级时运算对象与运算符的结合顺序,即该操作数是先与左边的运算符结合还是先与右边的运算符结合。表2.3算术运算符的优先级和结合性2.4.2赋值运算符及赋值表达式
1.赋值运算符
赋值符号“=”就是赋值运算符,它的作用是将一个表达式的值(或一个数据)赋给一个变量。赋值运算符的优先级仅高于“,”运算符。赋值运算符的一般形式为
变量=赋值表达式;
如果表达式值的类型与被赋值变量的类型不一致,但都是数值型或字符型时,系统自动地将表达式的值转换成被赋值变量的数据类型,然后赋给变量。具体有以下几种情况:
(1)将实型数据(单、双精度实数)赋给整型变量时,舍弃实数的小数部分,在内存中以整数形式存放,如a为整型变量,运行“a=1.56;”的结果是a的值为1。
(2)将整型数据赋给单、双精度变量时,数值不变,但以浮点形式存放在变量的存储单元中。如有a=12,而a是float变量,运行时,先将12转换成12.00000,然后再存放到a中。若a是double型变量,则先将12转换成12.0000000000000,再以双精度浮点数形式存放到变量a中。
(3)将一个双精度数据赋给一个单精度变量时,截取前面7位有效数字存放到单精度变量的存储单元中,但要注意范围不能溢出。如:
floatf;
doubled=123.456789e100
f=d;
就会出现溢出错误。
2.赋值表达式
1)赋值表达式
由赋值运算符或复合赋值运算符将一个变量和一个表达式连接起来而形成的表达式称为赋值表达式。赋值表达式的一般格式为
<变量><(复合)赋值运算符><表达式>
2)赋值表达式的求解过程
将赋值运算符右侧表达式的值赋给左边的变量,赋值表达式的值就是被赋值变量的值。任何一个表达式都有一个值,赋值表达式也不例外。2.4.3复合赋值运算
1.复合赋值运算符
复合赋值运算符是由赋值运算符“=”之前再加上一个双目运算符构成的。例如:
i+=1; /*“+=”为复合赋值运算符*/
a*=b-2; /*“x=”为复合赋值运算符*/
r%=3; /*“%=”为复合赋值运算符*/
C语言规定了如下10种复合赋值运算符:
+=,-=,*=,/=,%=; /*复合算术运算符(5个)*/
&=,∧=,1=,<<=,>>=。 /*复合位运算符(5个)*/
2.复合赋值运算
复合赋值运算的一般格式为
它等价于:
变量=变量双目运算符(表达式)
当表达式为简单表达式时,表达式外的一对圆括号才可缺省,否则可能出错。2.4.4关系运算符与关系表达式
1.关系运算符
在C语言中有以下关系运算符,如表2.4所示。表2.4C语言中使用的关系运算符关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<、<=、>、>= 的优先级相同,其高于 == 和 !=,== 和 != 的优先级相同。
2.关系表达式
关系表达式的一般形式为:表达式关系运算符表达式
例如:a+b>c-d、x>3/2、'a'+1<c、-i-5*j==k+1都是合法的关系表达式。由于表达式也可以是关系表达式。因此也允许出现嵌套的情况,例如:a>(b>c)、a!=(c==d)等。关系表达式的值是“真”和“假”,用“1”和“0”表示。如5>0的值为“真”,即为1。(a=3) > (b=5),由于3 > 5不成立,故其值为假,即为0。
程序说明:在本例中求出了各种关系运算符的值。字符变量是以它对应的ASCII码参与运算的。对于含多个关系运算符的表达式,如k==j==i+5,根据运算符的左结合性,先计算k==j,该式不成立,其值为0;再计算0==i+5,也不成立,故表达式值为0。图2.7例2.5的运行结果2.4.5逻辑运算符与逻辑表达式
1.逻辑运算符
C语言提供了三种逻辑运算符:&& (与运算),|| 或运算,! (非运算)。&& 和 || 均为双目运算符,具有左结合性。!为单目运算符,具有右结合性。
2.运算符优先级
逻辑运算符的优先级关系如表2.5所示。表2.5逻 辑 运 算 符
3.逻辑运算的值
逻辑运算的值也为“真”和“假”两种,用“1”和“0”来表示。其求值规则如下:
(1)与运算&&:参与运算的两个量都为真时,结果才为真,否则为假。
(2)或运算||:参与运算的两个量只要有一个为真,结果就为真。两个量都为假时,结果为假。
(3)非运算!:参与运算量为真时,结果为假;参与运算量为假时,结果为真。
4.逻辑表达式
逻辑表达式中的表达式可以又是逻辑表达式,这样就组成了嵌套的情形。例如:(a&&b)&&c。根据逻辑运算符的左结合性,上式也可写为:a&&b&&c。逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。
【例2.6】逻辑表达式。
程序如下:图2.8例2.6的运行结果程序说明:本例中!x和!y分别为0,!x*!y也为0,故其输出值为0。由于x为非0,故!!!x的逻辑值为0。对x||i&&j-3,先计算j-3的值为非0,再求i&&j-3的逻辑值为1,故x||i&&j-3的逻辑值为1。对i < j&&x < y,由于i < j的值为1,而x<y为0,故表达式的值为1和0相与,最后为0。对i==5&&c&&(j=8),由于i==5为假,即值为0,该表达式由两个与运算组成,所以整个表达式的值为0。对x+y||i+j+k,由于x+y的值为非0,故整个或表达式的值为1。2.4.6条件运算符与条件表达式
1.条件运算符
条件运算符为“?”和“:”,它是一个三目运算符,即有三个参与运算的量。
2.条件表达式
1)一般形式
由条件运算符组成条件表达式的一般形式为
表达式1?表达式2:表达式3
2)求值规则
条件表达式的求值规则为:如果表达式1的值为真,则以表达式2的值作为整个条件表达式的值,否则以表达式2的值作为整个条件表达式的值。
3)条件表达式的使用
条件表达式通常用于赋值语句之中。如条件语句:
if(a>b)max=a;
elsemax=b;
可用条件表达式写为
max=(a>b)?a:b;
执行该语句的语义是:如果a > b为真,则把a赋予max,否则把b赋予max。使用条件表达式时,还应注意以下几点:
(1)条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此
max=(a>b)?a:b
可以去掉括号而写为
max=a>b?a:b。
(2)条件运算符由“?”和“:”组成,是一对运算符,不能分开单独使用。
(3)条件运算符的结合方向是自右至左。例如:
a>b?a:c>d?c:d
应理解为:a>b?a:(c>d?c:d),这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。图2.9例2.7的运行结果2.4.7逗号运算符与逗号表达式
C语言提供一种用“,”连接起来的式子,称为逗号表达式。逗号运算符又称顺序求值运算符。
1.逗号表达式的一般形式及求解过程
逗号表达式的一般形式为
表达式1,表达式2,……,表达式n
逗号表达式的求解过程:由逗号隔开的一系列表达式从自左至右依次计算各表达式的值,“表达式n”即最后一个表达式的值为整个逗号表达式的值。
2.逗号在C语言中不同情况下的作用
并不是任何地方出现的逗号都是逗号运算符。很多情况下,逗号仅用作分隔符。
(1)逗号在变量说明表和初始值表中起分隔作用。例如:
intx,y,z[6];
(2)在函数的参数表中,逗号作为各参数的分隔符。例如:语句
printf(″%d,%d,%d″,x,y,z);
中的逗号是分隔符。但是如果改为
printf(″%d,%d,%d″,(x,y,z),y,z);
则“(x,y,z)”就是一逗号表达式,即该括号中的逗号是逗号运算符,其值是z的值。最后两个逗号是分隔符,表示有三个输出项。
3.逗号作为运算符中较低的优先级
逗号作为运算符在所有运算符中级别是最低的。因此需要注意以下两个表达式的计算:
(1) x=(a=1,2*3):此式的运算是将一个逗号表达式的值赋给变量x,即x=6。
(2) x=a=1,2*3:此式是一个逗号表达式,变量x为1,即x=1,而逗号表达式的值为6。2.4.8取址运算符&
例1.2中“&n1,&n2,&n3”中的“&”是“地址运算符”,&n1指取n1在内存中的地址。下面用例子来加以说明。运行时按以下方式输入“abc”的值:
①按十进制格式输入“abc”的值时,两个值之间用空格隔开;
②按十进制格式输出“a,b,c”的值时,“,”原样输出,所以两个值之间用逗号隔开。
运行结果如下如图2.10所示。
程序说明:scanf函数的作用是从键盘输入a、b、c三个变量的值,按照它们的地址存储到相应的内存单元中去。图2.10例2.8的运行结果2.4.9运算符的优先级与结合性
1. C语言中运算符的优先级和结合性
所谓运算符优先级是指表达式中出现多个运算符时,运算符执行的先后次序,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年版房地产买卖合同模板
- 2024年港口疏浚及堤坝修建合同3篇
- 劳动合同书电子版
- 水甲苯精馏塔课程设计
- 插班课程设计案例分析
- 管道课程设计小结
- 航空物流课程设计
- 航天研学课程设计
- 烘焙网络营销课程设计
- 机械小车课程设计
- 中国铝业股份有限公司河南分公司巩义市山川铝土矿矿山地质环境保护与土地复垦方案
- 工商企业管理毕业论文范文六篇
- 二十五项反措检查表优质资料
- 保密办主任工作总结保密办主任工作总结八篇
- 新生儿沐浴及抚触护理
- 机械原理课程设计-压床机构的设计
- 教学案例 英语教学案例 市赛一等奖
- 四川省2023职教高考英语试题
- JJG 913-2015浮标式氧气吸入器
- GB/T 12190-2006电磁屏蔽室屏蔽效能的测量方法
- 2020年贵州专升本高等数学真题及答案
评论
0/150
提交评论