版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2.1 C的数据类型 2.2 常量与变量 2.3 整型数据 2.4 实型数据 2.5 字符型数据 2.6 变量赋初值,第2章 数据类型、 运算符与表达式,2.7 各类数值型数据间的混合运算 2.8 算术运算符和算术表达式 2.9 赋值运算符和赋值表达式 2.10 逗号运算符和逗号表达式 习题,第2章 数据类型、 运算符与表达式,第2章 数据类型、运算符与表达式,为了方便地表示这些不同种类的数据,C语言提供了丰富的数据类型。,在实际问题中,可能会遇到各种各样的数据。这些数据都以某种特定的形式存在着。,年龄:22,工资:2381.85,姓名: Hussein Sadam,整数 实数 字符串,标识符
2、,在C语言中,变量名、符号常量名、函数名等统称为标识符。C语言规定,标识符只能由字母、数字和下划线组成,且第一个字符只能是字母或下划线。,下列是合法的标识符,可以充当变量名等。 sum,student_name,_part_1,但是,下面这些标识符不合法, Mr.Wang,ab,1_2_3,大小写敏感,sum,Sum,SUM是3个不同的标识符。,关键字不能作为标识符。,ANSI C未规定标识符的最大长度,TC最多允许32个字符。,应尽量做到“见名知意”。,关于标识符应注意以下方面:,C的数据类型,数据类型,数据所占空间的大小和存储格式有数据类型来决定,因此必须为出现在程序中的所有数据指定数据类
3、型。,由于C语言把程序中的数据又分为变量和常量两大类,因此,不论是常量数据还是变量数据,都要指定数据类型。,C语言根据什么把数据分为变量和常量?,2.2 常量与变量,在程序执行过程中其值可以改变的量称为变量。,在程序执行过程中,其值不能被改变的量称为常量。, int a; float b; a=-90; b=3.14*2.1; ,字面值常量,计算机处理的数据都要存储,存储就要有空间。如果这个空间中的数据不能被修改,这个空间就称为常量空间,简称常量。 所谓字面值常量,就是一种常量空间的名称. 特点:它由常量值和表示该数值类型的后缀字符或界限符组成。,52388L 是长整型字面量,其中52388是
4、常量值,L 是代表长整型的后缀。 3.1416F 是单浮点型字面量,其中3.1416 是常量值,F是代表单浮点型的后缀; A是字符型字面量,A 是常量值,单引号是定界符; 普通整型和双浮点型的字面量没有表示类型的后缀,它们是默认的,例如:345 是普通整型字面量,3.1416是双浮点型字面量。,有了字面常常量的概念,我们就可以严格地说明赋值操作符“=”两边的含义:从右边的名称所表示的空间中读取数据,存储到左边的名称所表示的空间中。 示例2.5,符号常量,如果在程序中某处定义了符号常量(以PI为例), 从此往后,本文件中凡是出现PI的地方都代表3.14;, #define PI 3.14 #de
5、fine SNO 1001 L=2*PI*1.5; s=PI*0.6*0.6; ,#define 符号名 常量值,file1.c,所谓符号常量,就是用符号代表的一个常量。符号常量的定义方式为:,为什么要用符号来表示一个常量呢?这样做有什么好处?,PI可以和常量3.14一样参加运算.,符号常量,在程序中,适当使用符号常量的好处在于:,能起到“见名知意”的作用,比直接写个常量直观。,能做到“一改全改”。,关于符号常量再强调以下几点:,符号常量名习惯上常用大写;,符号常量是常量而不是变量,不允许用赋值运算等改变它的值。, #define PI 3.14 #define SNO 1001 L=2*PI
6、*1.5; s=PI*0.6*0.6; ,变 量,每个计算机上都要有内存,程序只有装入到内存中,才可能被执行。,从逻辑上看,内存是由一个个的字节构成的。,内 存,每个字节都有唯一的内存地址。,每个字节可以容纳8位二进制数。,二进制位,变 量,所谓变量,就是在程序执行过程中,其值可以被改变的量。通俗地讲,变量就像高档饭店的房间,这体现在以下几个方面:,对某个房间来说,一拨客人走后,另一拨客人可以进来,虽然房间不变,但里头吃饭的人在变。,在C程序中,变量就是建立在内存里的房间,它用来存储不断变化的信息。存放在变量中的信息称为变量值。,为了区分不同的房间,人们为每个房间起一个名字,比如百合厅、玫瑰厅
7、等。,每个变量也有变量名。,房间有大小、档次之分。,变量有类型之分,变量的数据类型决定了可以容纳的信息种类,也决定了所占单元的大小。,每个房间有自己的房间号,而且房间名与房间号有对应关系。,每个变量有自己的存储地址,而且变量名与存储地址有对应关系。,总之,变量具有名字、类型、值、地址等属性。,如果需要一个变量空间,一般需要通过定义来要求系统分配,定义时要指出变量(空间)的类型,并给出变量(空间)的名称,也称变量(空间)标识符。这个名称由用户指定,但要符合命名规则。通过变量名读写变量空间数据的方式称为直接引用方式。 变量定义的格式为: 数据类型 标识符变量名;,例如: int m,n; /定义两
8、个普通整型变量m 和n float x; /定义一个单精度浮点实型变量x char ch; /定义一个字符型变量ch,运用赋值操作符“=”可以给变量赋值: m=70; x=3.14; ch=A;,利用取址操作符“ a=10; a=a*2; printf(”a=%dn”,a); ,在C程序中,变量都是先定义、后使用的。定义变量的格式为: 数据类型 变量名;,对于程序中定义的每个变量,TC会根据变量的数据类型,为它分配一定大小的存储单元。 与此同时,也在变量名与变量的内存地址之间建立了对应关系。,该赋值语句会把10存放到变量a中,于是a的值变为了10。 实现过程:首先通过变量名找到相应的内存地址,
9、再把数据写入相应的存储单元里。,主函数框架,C 语言程序的基本形式是一个主函数框架: main() 一组程序语句 或者 void main() 一组程序语句 ,int main() 一组程序语句 return(0); ,变量初始化,变量可以在定义的同时赋值,称为初始化: int m=70; /初始化 变量初始化与赋初值是不同的:初始化是在变量定义的同时赋值,赋初值是指变量定义之后的第一次赋值。初始化等于赋初值,但是赋初值不等于初始化。 下面的例子是赋初值,但不是初始化: int m,n; m=70; /给m 赋初值 n=m; /给n 赋初值,文件包含命令,#include 是文件包含命令,st
10、dio.h 是库文件,含有包括系统函数printf 在内的输入输出函数的原型。如果不包含这个命令而调用printf 函数,系统视为非法。系统报错:printf undefined(printf 没有定义),格式输出函数printf,系统函数printf 的功能是按照指定的格式在显示器上输出。一般形式为: printf( 格式控制字符串,输出参数1,输出参数2,);,举例说明: printf(%d,%d,%f,%cn,m,n,x,ch); m、n、x、ch 分别为输出参数14。“%d,%d,%f,%cn”是格式控制字符串,它由两部分组成:格式分隔符和格式说明符。 格式说明符由“%”加一个格式描述
11、符组成,用以指定对应输出参数的类型和输出格式:格式说明符与对应的输出参数在类型上要一致。,示例:2.1,2.2 整型数据,下面来学习整型数据在C程序中的表示方法。 先来复习一下数制和数制之间的转换。平时我们遇到的整数都是十进制形式的,在计算机科学中,还会用到二进制、八进制以及十六进制表示的整数。,知识补充:各种进位制数之间的转换,各种进制数的关系 23=8 24=16,各种进位制数之间的转换,1. 十进制数转换成r进制数 转换规则 整数部分:除r取余,将余数从下往上取出来。 小数部分:乘r取整,将取整的结果按顺序取。,1. 十进制数转换成r进制数 例: (23)10=(10111)2 例: (
12、23)10=(27)8,练习:将十进制数(123.8125)10转换成二进制数,八进制数,十六进制数,练习:将十进制数(123.8125)10转换成二进制数,八进制数,十六进制数 (123.8125)10=(1111011.1101)2 =(173.64)8 =(7B.D)16,2. r进制数转换成十进制数 转换规则: 按权展开相加法 例: (10111.1011)2 =(23.6875)10 (10111.1011)2 =124+023+122+121+120+12-1 +02-2+12-3+ 12-4 =116+08+14+12+11+10.5+00.25+ 10.125+10.0625
13、=16+4+2+1+0.5+0.125+0.0625 =(23.6875)10 例: (27.54)8 =(23.6875)10 (27.54)8 =281+780+58-1+48-2 =28+71+50.125+40.015625 =16+7+0.625+0.0625=(23.6875)10,练习: 将下列二进制数、八进制数、十六进制数转换成十进制数: (1011.101)2 (123.45)8 (3AF.4C)16,练习: 将下列二进制数、八进制数、十六进制数转换成十进制数: (1011.101)2=(11.625)10 (123.45)8=(83.578 125)10 (3AF.4C)1
14、6=(943.296 875)10,整数从右向左 小数从左向右,二进制 十六进制,二进制 八进制,各种进制数的关系: 23=8 24=16,二进制与八进制对照表:,二进制与十六进制对照表:,3. 二进制数与八进制数的转换 二进制数转换成八进制数 整数: 从右向左,每3位分一组. 小数: 从左向右,每3位分一组,最后一组若不足3位,在该组后面补相应数量的0,凑成3位. 再将每组按二进制数向十进制数转换的方法进行转换. 例: (10110101.1011)2 =(265.54)8 分组为10,110,101.101,100,转换结果为(265.54)8 八进制数转换成二进制数 分别将每一位八进制数
15、转换成3位二进制数. 例: (265.54)8 =(10110101.101100)2,4. 二进制数与十六进制数的转换 二进制数转换成十六进制数 整数: 先将二进制整数从右向左每隔4位分一组. 小数: 先将二进制小数从左向右每隔4位分一组,最后一组若不足4位,在该组后面补相应数量的0,凑成4位. 将每组转换成十六进制数. 例: (10110101.1101101)2 =(B5.DA)16 先将10110101.1101101分组为1011,010.1101,1010 十六进制数转换成二进制数 分别将每一位十六进制数转换成4位二进制数. 例: (B5.DA)16 =(10110101.1101
16、1010)2,5. 八进制数与十六进制数的转换 八进制数转换成十六进制数 将每一位八进制数转换成3位二进制数; 再按二进制数向十六进制数转换方法转换. 十六进制数转换成八进制数 将每一位十六进制数转换成4位二进制数; 再按二进制数向八进制数转换方法转换.,练习: 将二进制数(1111011.1101)2转换成八进制数、十六进制数 (1111011.1101)2= (1111011.1101)2=,练习: 将二进制数(1111011.1101)2转换成八进制数、十六进制数 (1111011.1101)2=(173.64)8 (1111011.1101)2=(7B.D)16,作业: 将八进制数(1
17、73.64)8转换成二进制数、十六进制数 (173.64)8=,练习: 将八进制数(173.64)8转换成二进制数、十六进制数 (173.64)8=(001111011.110100)2,2.2 整型数据,由于C语言把数据分为常量和变量两大类,所以整型数据也相应地分为整型常量和整型变量。,1整型常量的表示方法,整型常量可以以三种形式出现在C程序中。,(2)八进制形式 为了避免与十进制形式混淆,这种形式要求以0开头.如0123表示八进制数123,即(123)8,其值为 182+281+380,等于十进制的83。,(1)十进制形式 例如 123,5,0,(3)十六进制形式 这种形式要求以0 x开头
18、。如0 x123表示十六进制数123,即(123)16,其值为1162+2161+3160,等于十进制的291。,整型变量,我们可以用 int 变量名; 来定义整型变量。例如,int i;,此时,我们可以用赋值语句把整型数据存放到变量i中。例如,用 i=10; 可以把10存放到变量i中,也就是把10存放到变量i的4字节的存储单元中。,在变量中有值以后,我们可以用%d格式符来输出整型变量值,例如, printf(”%d”,i); 会输出10。,内存,201,202,203,204,205,206,207,32位操作系统会在内存中自动分配4字节的存储单元,共计32个二进制位。,10,整型数据10在
19、存储单元中是如何存放的呢?,整数:数值的编码 整数分为带符号和不带符号两种,带符号的整数最高位就是符号位。,符号位表示 单字节无符号数:028-1 (0255) 单字节有符号数:-128+127,符号位,例:一个字节可以表示十进制整数的范围: 0255或者:-128+127,二进制数的原码、反码和补码 在计算机中,任何数据都可以用原码、反码和补码来表示,这三种表示法在不同的计算机中都有采用。 原码: 数值的原码表示是指,将最高位用作符号位(0表示正数,1表示负数),其余各位代表数值本身的绝对值(以二进制形式表示)的表示形式。,表示规则 正数 符号位为0,数值位不变. 负数 符号位为1,数值位不
20、变. 例: 47的原码表示. 47原=00101111原 - 47的原码表示. - 47原=10101111原,缺点: 零的表示不惟一: +0原 =000.0 -0原 =100.0 由于在计算机中把符号位和数值放在一起编码表示真值,并将符号位作为数值位一起参加运算,因此原码对真值“0”的两种不同的表示,必将引起不同的运算结果。因此在计算机中一般不用原码作加减运算。,反码 表示规则 正数的反码与原码表示相同。 负数的反码与原码有如下关系:负数的反码是将它的原码除符号位外的其它位按位取反。(0变1,1变0)。 例如: +1反=0000 0001 -1反=1111 1110 练习: +127反= -
21、127反=,反码 表示规则 正数的反码与原码表示相同。 负数的反码与原码有如下关系:负数的反码是将它的原码除符号位外的其它位按位取反。(0变1,1变0)。 例如: +1反=0000 0001 -1反=1111 1110 练习: +127反=0111 1111 -127反=1000 0000,将反码还原为真值的方法:反码原码真值 即当反码的最高位为0时,其后的二进制数值即为真值,且为正; 最高位为1时,则为负数,其后的二进制数按位取反才为真值。 已知x反= 11010000 ,求x,将反码还原为真值的方法:反码原码真值 即当反码的最高位为0时,其后的二进制数值即为真值,且为正; 最高位为1时,则
22、为负数,其后的二进制数按位取反才为真值。 已知x反= 11010000 ,求x x原= 1010 1111 x= -47,反码中零的表示也不惟一 0反 =0000 0000 -0反 =1111 1111 同样,由于反码对0的两种不同表示将造成计算机不同的运算结果,所以计算机一般不采用反码存储和反码进行运算,主要用于通过反码求补码。,补码 数值的补码表示也分两种情况: 正数的补码:与原码相同。 负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。 例 +9的补码:00001001 -9的反码:11110110 -9的补码:11110111,练习: +1补= -1补= +12
23、7补= -127补=,练习: +1补=0000 0001 -1补=1111 1111 +127补=0111 1111 -127补=1000 0001,当 x=0时 分析: 负整数0的原码,符号位1,其它位0 10000000 (假定共8位,最高位是符号位) 负整数0的反码,符号位不变,为1,其它位0变1, 11111111 负整数0的补码,等于它的反码加1 - 11111111 + 1 = 100000000 方括号里的1因溢出,自动丢失,成为 00000000 所以正整数0和负整数0的补码相同 +0补=0000 0000 -0补=0000 0000 因此,计算机中一般都采用补码进行运算,整型
24、数据的存储,整型数据在存储单元中是如何存放的呢?。(符号)整型变量以高位(第1 位)表示符号(0 代表正,1 代表负),剩余位表示数值。 数值以补码形式存放,1若数据0,数据直接以其二进制形式存放,内存,201,202,203,204,205,206,207,i,由于10的二进制形式是1010,所以10的存放情况如图所示。,整型数据的存储,2若数据0,数据以其补码形式存放。,内存,201,202,203,204,205,206,i,由于-10的补码为1111111111110110,所以-10的存放情况如图所示。,求负数的补码的方法是:将负数的绝对值的二进制形式按位取反,再加1。,整型变量的分
25、类,在有些场合例如,全国人口数、汽车数等,数的范围很大;在有些情况下,数的范围又很小,造成内存的浪费,例如年龄、月份等。于是,C语言又对整型变量作了进一步的分类,细分为三种:,基本整型:以 int 表示。 int sum;,短整型:以 short int 或 short 表示。 short age;,长整型:以 long int 或 long 表示。 long increment;,在32 位操作系统中,短整型变量占2 个字节,其他整型变量占4 个字节。 (符号)整型变量以高位(第1 位)表示符号(0 代表正,1 代表负),剩余位表示数值。数值以补码形式存放. 因此: 短整型变量的数值范围是-
26、215 至215-1(-3276832767)。 普通整型和长整型变量的数值范围是-231 至231-1(-21474836482147483647)。 无符号整型变量没有符号位,数值位多一个,最大值增加一倍,最小值为0。,整型变量的分类,各类型的变量可以容纳的整数范围是什么?显然,这取决于为各类型的变量所分配的存储单元的大小。,基本整型:以 int 表示。 int sum;,短整型:以 short int 或 short 表示。 short age;,长整型:以 long int 或 long 表示。 long increment;,ANSI C并未具体规定各类整型变量的存储单元的大小,具体
27、由各厂家自行决定,但要符合以下原则: 长整型的存储单元基本整型的存储单元短整型的存储单元,无符号整型变量,在有些应用场合,涉及的整数均为非负整数,如学号、年龄、人口数等。在这种情况下,可以使用无符号整型变量。无符号整型变量也有三种类型:,无符号基本整型: 以 unsigned int 或 unsigned 表示。 unsigned stu_no;,无符号短整型: 以 unsigned short int 或 unsigned short表示。 unsigned short age;,无符号长整型: 以 unsigned long int 或 unsigned long 表示。 unsigned
28、 long population;,容易看出,对前三种类型添加 unsigned 修饰符,就得到了无符号整型的表示。相应地,前三种类型被称为有符号整型。 另外, 无符号整型与对应的有符号整型所需存储单元大小相同.,无符号整型变量和有符号整型变量的区别,有符号整型变量b的存储单元中最左一位代表符号(0为正,1为负),无符号变量a只能表示非负整数。,下面以如下定义的变量a、b为例来加以说明。 unsigned short a; short int b;,符号位,无符号整型变量a的存储单元中所有二进制位都用来存放数据本身,并无符号位。,最大值:216-1=65535,最小值:0,最大值:215-1=
29、32767,最小值:-215=-32768,一般地说,无符号整型变量所能表示的最大值比有符号整型变量所能表示的最大值扩大一倍。,a,b,有符号短整型变量b正负均可。,a的取值范围为065535,b的取值范围为3276832767,整型变量总结,下面列出了C语言中提供的六种整数类型。,无符号基本整型:unsigned int 或 unsigned,无符号短整型: unsigned short int 或 unsigned short,无符号长整型: unsigned long int 或 unsigned long,基本整型:int,短整型: short int 或 short,长整型: lon
30、g int 或 long,有符号整型,虽然ANSI C并未统一规定各类整型变量的存储单元所占字节数,但每个C系统都有自己的明确规定。 在定义整型变量时,应根据可能的取值范围来确定变量的类型.,整型常量的类型,C语言规定,程序中的所有数据,不论是常量还是变量,都要为其指定数据类型,下面来看一下整型常量的类型。,(1)其值在3276832767区间内的整型常量被认为是short int 型的,也可以把它赋值给 short int 型或 int 型变量。,(2)其值在3276832767区间外但在2312311区间内的整型常量被认为是int或 long int 型的,可把它赋值给 long int
31、型变量。,(3)一个非负整数后面加一个字母u/U,被认为是无符号型的,在内存中按无符号方式存放。例如,12345u。,(4)一个整数后面加一个字母l/ L,被认为是long int型的。 例如,123L、0L、-1L。,示例2.2,2.3 实型数据,在介绍实型数据之前,先来了解一下关于有效数字的概念。,一个数的有效数字是指从该数最左边不为0的数字位起至最右边不为0的数字位止之间的每一个数字位,而这些数字位的个数称为该数的有效数字位数。,另外,若一个数带有指数部分,它不影响该数的有效数字位数。,0.00104,实型常量的表示方法,实型常量可以以两种形式出现在C程序中:,(2)指数形式 例如,-1
32、23.4e3, 1.82E-3, -0.0073e+5,(1)十进制小数形式 例如,123.4,123.,-.123,0.0,一定要有小数点,否则就不是实型常量。,注意:在e的前后一定要有数字,e2、1E 不合法。,-123.4103,1.8210-3,-0.0073105,在e的后面务必是整数, 1.3E3.5 不合法。,一个实数可以用多种指数形式表示出来。,123.45可表示为: 1234.5e-1,123.45e0,1.2345e2,0.12345e3,规范化的指数形式,在e前的部分中,小数点前有且仅有一位数字,而且是非0数字,实型变量,我们可以用 float 变量名; 来定义实型变量。
33、例如,float a;,此时,我们可以用赋值语句把实型数据存放到变量a中,例如,用 a=123.456; 可以把123.456存放到变量a中。,可以按小数形式或按规范化的指数形式来输出实型变量值。例如, printf(”%f”,a); 会输出 123.456000 printf(”%e”,a);会输出 1.23456e+02,内存,201,202,203,204,205,206,207,TC系统会在内存中为它分配4字节的存储单元,共计32个比特。,123.456,实型数据在存储单元中是如何存放的呢?,实型数据的存储,下面来讨论实型数据在32比特的存储单元中是如何存放的?,实际上,32比特的存储
34、单元被分为如下的3大部分。每个实型数据在存储时,是按指数形式存放的。,小数部分,指数部分,ANSI C标准并没有规定每一部分各占多少二进制位。显然,在总位数一定的前提下,小数部分占的位数越多,则可表示数的更多有效数字位,数值的范围就越小;反之,指数部分占的位数越多,则数值的范围就越大,可表示的有效数字位就更少。,符号位,实型变量的分类,为了适应不同的应用场合,C语言把实型变量进一步分类为 :,单精度型:以 float 表示。 float x;,长双精度型:以 long double 表示。 long double z;,双精度型:以 double 表示。 double y;,由表可以看出,fl
35、oat型变量的有效数字位数为67,这意味着float型变量最多只保证接收7位有效数字。因此,若定义 float a; a=123456.789; 那么,由于float型只能接收7位有效数字,所以最后两位将被舍去,这样就会造成舍入误差。,Turbo C关于各类实型变量的规定,请参见P46表3-2。,实型常量的类型,一般情况下,实型常量被认为是双精度型的。例如,,一个实型常量既可以赋值给float变量,也可以赋给double变量,只是接收的有效数字位数不同而已。,float a; a=1.23*0.456; 系统会把1.23和0.456作为双精度数据存储和运算,得到一个双精度的乘积,然后取前7位有
36、效数字赋给变量a。这样做的好处是提高了精度,但也降低了运算速度。,如果希望C系统把某实型常量按单精度处理,只要在该数据后面加上f或F即可。例如,1.23f -10.836F。,float a; double b; a=123456.789; /*接收7位*/ b=123456.789; /*9位全接收*/,3.5 字符型数据,P364附录I 给出了所有在程序中可以使用的字符,每个字符都有一个编码,称为ASCII码。例如,,相邻字母或数字的ASCII码差1,对应大小写字母的ASCII码差32,通过分析,不难发现ASCII码有以下规律:,大写字母,小写字母,数字字符,转义字符,理论上讲,ASCII
37、码表中的字符都可以出现在C程序中。像字母数字等字符可以直接从键盘上输入,但是,图形字符、控制字符无法直接从键盘上输入。在程序中如何表示它们呢?,实际上,可以用转义字符形式表示任意字符,有两种形式:,C语言用以 开头的字符序列来表示这些字符,例如, 用 n 表示“换行符”(ASCII码为10) 用 b 表示“退格符”(ASCII码为8) 这种形式的字符称为“转义字符”,意思是把反斜杠后面的字符转换为别的意义。如n中的n不代表字母n,而代表“换行符”。,常见的转义字符如P48表3-3所示。,八进制:格式为 ddd 。其中,ddd代表要表示字符的ASCII码的八进制形式。 例如,101 代表ASCI
38、I码为65=(101)8的A。,十六进制: 格式为 xhh 。其中,hh代表要表示字符的ASCII码的十六进制形式,例如, x41代表ASCII码为65=(41)16的A。,字符常量,需要注意的是: 要想用字符 构成字符常量,不能写为 ,而应写作 要想用字符 构成字符常量,不能写为,而应写作,与整型、实型类型数据一样,字符数据也分为字符常量和字符变量。,字符常量是用单撇号括起来的单个字符。例如, a , D , , n , 101,字符变量,我们可以用 char 变量名; 来定义字符变量。例如 char ab;,可以用赋值语句把字符常量存放到字符变量中,例如, ab=A; 可把字符A存放到变量
39、ab中。,内存,201,202,203,204,205,206,207,TC系统会在内存中为每个字符变量分配1字节的存储单元 。,A,ab,可以用格式符%c来输出字符变量的值。例如,printf(“%c”,ab);会输出A。它会按ab中存的ASCII码输出相应字符。,注意:存储单元中实际存放的是字符A的ASCII码65,且以二进制形式。,字符变量中只能存放一个字符,字符数据与整型数据可以通用,由于字符数据在内存中以ASCII码存放,而且其存储形式和整数的存储形式类似,所以C语言中字符数据与整型数据之间可以通用。这体现在三方面:,1.字符数据可以参加算术运算 例如,100-A,该式的值为100-
40、65=35,2.可以把整数赋值给字符变量 例如,ab=66;,3.字符数据既能按字符形式输出,也能按整数形式输出。,当以整数形式输出时,使用 %d 格式符,直接将ASCII码作为整数输出。 printf(%d,ab);,当以字符形式输出时,使用 %c 格式符,系统输出的是存储单元中的ASCII码所对应的字符。 printf(%c,ab);,ab,字符变量举例,#include void main() char ab; ab=A; printf(%c,ab); printf(%d,ab); ab=ab+32; printf(%c,ab); printf(%d,ab); ,/* CH3/CHARI
41、NT.C */,字符串常量,C语言除了允许使用字符常量外,还允许使用字符串常量。,字符串常量就是用双撇号括起来的字符序列。例如, ”CHINA” 就是一个字符串常量。,我们可以用 printf(”CHINA”); 或者 printf(”%s”,”CHINA”); 来输出字符串。,字符常量和字符串常量的区别,1.从形式上看, 字符常量是单个字符用单撇号括起来,例如, A,n, 0,2.从存储上看, 为保存一个字符常量只需1字节的内存;,设置字符串结束符的目的在于,方便函数判断字符串是否结束。例如,在用 printf(“CHINA”);,输出时,是一个字符一个字符的输出,直到遇到0为止。,字符串常
42、量是若干个字符用双撇号括起来,例如, ”USA”,”A”,”,为保存字符串常量,除了要为串中的每个字符分配1字节外,还要多分配一个字节用来存放 字符串结束符即0。例如,为保存“CHINA” 需要6个字节的内存。,字符常量和字符串常量比较,3.字符变量可以用来保存字符常量的值,例如, char c; c=A; 但是,字符变量不能用来保存字符串常量,例如, c=”A”; 是非法的,字符串常量可以保存在字符数组中。,4.字符 可以直接出现在字符串中,例如,”Im” 是合法的字符串。 但是,字符 ” 不能直接出现在字符串中,而应以”的形式出现在字符串中。例如,不能写为”abc”d”,应写为”abc”d
43、”,3.6 变量赋初值,另外,可以同时对多个变量进行初始化,例如, int a=3,b,c=20; int a=3,b=3,c=3; 但是,第二个式子不能写成: int a=b=c=3;,C语言允许在定义变量的同时,为变量设置初值,该过程称为变量的初始化。例如,,int i=3; float f=3.14; char c=P;,int i; i=3;,3.7 各类数值型数据间的混合运算,前面学过,整型数据可以细分为short、int、long,实型数据可以细分为float、double,并且知道字符数据与整型数据之间可以通用。,在实际应用中,可能需要将不同类型的数据进行混合运算。在进行混合运算
44、时,C系统会按照一定的规则,自动地将操作数转换成同一类型,然后再进行运算。 转换原则分为两部分,如图所示(P54图3-10)。,务必要做的转换,务必要做的转换,float型一律转化为double型,即使是两个float型数据运算。,char型、short型一律转化为int型 。,根据操作数的类型进行转换,级别低的向级别高的转换,注意:上述类型转换是由系统自动进行的。,根据操作数的类型进行转换,级别低的向级别高的转换,根据操作数的类型进行转换,级别低的向级别高的转换,3.8 算术运算符和算术表达式,运算符丰富是C语言的特点之一,P365附录III详细描述了C中的所有运算符,我们可以从多个角度对运
45、算符进行分类。,1. 按功能,算术运算符:+、*、/、% 关系运算符: 、=、=、!= 逻辑运算符:!、,在进行 (int)f 强制类型转换时,系统会生成一个int中间变量用来存放转换结果3,f的值不会改变. 参见P57例3.8。,需要注意的是,在强制类型转换时,系统会生成一个所需类型的中间变量用来存放转换结果。,自增、自减运算符,自增运算符:+ 自减运算符:-,功能:使变量i的值增1,用法:i+ +i,功能:使变量i的值减1,用法:i- -i,一、两个表达式的求解过程不同,下面以自增运算符为例加以说明。虽然+i与i+都可以使得变量i增1,但有差别。, i+是先把i的值作为表达式的值,再把i的
46、值增1;因此,该表达式的值等于i的旧值。例如, int i=3; printf(“%d”,i+); /*输出3*/, +i是先把i的值增1,再把i的值作为表达式的值;因此,该表达式的值等于i的新值。例如, int i=3; printf(“%d”,+i); /*输出4*/,自增、自减运算符,二、在有其它运算符的场合,二者作用不同。,5*(i+) i+是先使用i的值参与运算,然后再使i增1。 5*(+i) +i是先使i增1,然后再使用i的值参与运算。,#include void main() int i=3,j; j=+i; printf(”%d”,j+); /*ch3/inc.c*/,类似地,可以理解自减运算符的两
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 惠城物流劳务外包合同
- 企业招商业务外包合同
- 青海机械劳务外包合同
- 2025年城市通勤骑行服时尚设计
- 外贸采购发货外包合同
- 中央空调安装外包合同
- 网易用户运营外包合同
- 屠宰场猪副产品外包合同
- 游戏美术设计外包合同
- 交通路标志路灯外包合同
- 中医针灸师实践技能考核要点试卷及答案
- 宠物美容与护理操作手册(标准版)
- 肾内科慢性肾病管理工作制度及操作规范
- 光伏项目现场制度规范
- 2026年时事政治测试题库100道附答案【满分必刷】
- 施工围挡资源配置方案
- 2026年监考员考务工作培训试题及答案新编
- 2025年中国铁路哈尔滨局集团有限公司招聘294人参考笔试题库及答案解析
- 牛津树分级阅读绘本课件
- 域名权课件教学课件
- 2026年演出经纪人考试题库附参考答案(完整版)
评论
0/150
提交评论