980 likes | 1.12k Views
第二章 数据描述与基本操作. 本章学习重点: C 语言的基本数据类型 ; C 语言的变量与常量 ; 运算符与表达式以及数据类型的转换; 掌握条件编译的格式及使用方法。. 本章目录. 第二讲 基本数据类型、变量与常量 第三讲 运算符与表达式、数据类型的转换 第四讲 数据的输入与输出 本章小结. 结束. 第二讲 基本数据类型、变量与常量. 基本数据类型、变量与常量 练一练 本讲小结. 返回到本章目录. 基本数据类型、变量与常量. 【思考题 2 -1 】 已知一个圆的半径,求这个圆的周长和面积。 ( 一 )程序分析 :
E N D
第二章 数据描述与基本操作 本章学习重点: C语言的基本数据类型; C语言的变量与常量; 运算符与表达式以及数据类型的转换; 掌握条件编译的格式及使用方法。
本章目录 第二讲 基本数据类型、变量与常量 第三讲 运算符与表达式、数据类型的转换 第四讲 数据的输入与输出 本章小结 结束
第二讲 基本数据类型、变量与常量 基本数据类型、变量与常量 练一练 本讲小结 返回到本章目录
基本数据类型、变量与常量 【思考题2-1】已知一个圆的半径,求这个圆的周长和面积。 (一)程序分析 : 如果我们用r代表圆的半径,用l代表圆的周长,用s代表圆的面积,用PI代表圆周率π,那么圆的周长公式是l=2πr,圆的面积公式是s=πr2。在这两个公式里,PI是圆周率,固定不变的,而半径是可变的,则圆的周长与圆的面积也是可变的,那么,这些元素如何在C语言里进行说明并表示出来?这就是我们这一讲要重点讲述的内容。 返回到本章目录
(二)编写程序代码如下: #include "stdio.h" /*文件包含命令*/ #define PI 3.14 /*定义符号常量圆周率π*/ main() { int r; /*定义圆的半径r*/ float area,length; /*定义圆的面积s和周长l,为单精度浮点型*/ r=3; /*为半径变量r设置初始值*/ length=2*PI*r; /*计算圆周长,并把结果赋值给l*/ area=PI*r*r; /*计算圆的面积,并把结果赋值给s*/ printf("r=%d\n length=%f\narea=%f\n",r,length,area); /*输出运算结果*/ } 返回到本章目录
(三)调试程序及运行结果 按“Ctrl+F9”键,对程序进行编译,然后按“Alt+F5”键查看结果,程序运行结果如下所示: 返回到本章目录
1.标识符 (1)所谓标识符,是指用来标识程序中用到的变量、函数、类型、数组、文件以及符号常量等的有效字符序列。简言之,标识符就是一个名字。C语言中的标识符可以分为三类:即关键字、预定义标识符和用户自定义标识符。 返回到本章目录
(1)关键字 关键字又称保留字,是C语言规定的具有特定意义的标识符,它已被Turbo C 2.0本身使用, 不能作其它用途使用,每个关键字都有固定的含义。C语言的关键字分为以下四类: ① 标识数据类型的关键字(14个) int,long,short,char,float,double,signed,unsigned struct,union,enum,void,volatile,const ② 标识存储类型的关键字(5个) auto,static,register,extern,typedef 返回到本章目录
③ 标识流程控制的关键字(12)个 goto,return,break,continue,if,else,while,do,for,switch,case,default ④ 标识运算符的关键字(1个) sizeof 例如【思考题2-1】程序中的“float”就是数据类型的关键字,它表示单精度浮点型数据。 返回到本章目录
预定义标识符 预定义标识符是一类具有特殊含义的标识符,用于标识库函数名和编译预处理命令。系统允许用户把这些标识符另作它用,但这将使这些标识符失去系统规定的原意,为了避免误解,建议不要将这些预定义标识符另作它用。 返回到本章目录
C语言中常见的有以下几种: ① 编译预处理命令 define,ifdef,ifndef,endif,include,line,if,else等 例如【思考题2-1】程序中的“include”和“define”就是两个预定义标识符,要在其前面加“#”号,一般写在主函数main的上面。 ② 标准库函数 包括数学函数:sqrt,fabs,sin,pow等,还有输入输出函数:scanf,printf,getchar,putchar,gets,puts等。 例如思考题例程中的“printf”就是一个输出函数,通过这个函数可以把结果在显示器上显示出来。 返回到本章目录
(3)用户定义标识符 用户定义标识符是程序员根据自己的需要定义的用于标识变量、函数、数组等的一类标识符。用户在定义标识符时应符合C语言标识符的命名规则。 在C语言中,标识符的命名规则如下: ① 只能由字母、数字和下划线三种字符组成。 ② 第一个字符必须为字母或下划线。 例如【思考题2-1】程序中的“PI,r,l,s“就是用户自己定义的标识符,只要符合C语言标识符的命名规则即为合法。 返回到本章目录
短整型(short) 整型 整型(int) 长整型(long) 基本类型 单精度型(float) 实型(浮点型) 双精度型(double) 字符类型(char) 数组类型 C数据类型 结构体类型(struct) 构造类型 共用体类型(union) 枚举类型(enum) 空类型(void) 1.基本数据类型 返回到本章目录
3.变量 (所谓变量,是指在程序运行过程中其值可以改变的量。一个变量应该有一个名字,在内存中占据一定的存储单元。变量定义必须放在变量使用之前。一般放在函数体的开头部分。 变量定义的格式如下: 存储类型符 数据类型符 变量名表; 返回到本章目录
说明: ① 存储类型符用来说明变量的存储类型,存储类型可以是自动类型(auto),寄存器类型(register)、静态类型(static)、外部类型(extern),默认为自动类型(auto),如果对存储类型未做任何说明,则按默认的自动类型处理。 ② 数据类型符用来说明变量的数据类型,数据类型可以是C语言中任意一种基本数据类型或构造数据类型标识符。 ③ 变量名表中可以只有一个变量,也可以有多个变量,如果有多个变量,变量之间用逗号隔开。 返回到本章目录
(2)变量的赋值 定义变量后,在使用之前需要给定一个初始值。在C语言中,可以通过赋值运算符“=”给变量赋值。变量赋值语句的一般格式是: 变量名=表达式; 返回到本章目录
变量的赋值,一般有以下两种情况: ① 先定义变量,后赋值。 如【思考题2-1】程序开头的部分代码: int r; …… r=1; ② 变量的初始化。 在定义变量的同时为其赋值,称为变量的初始化。定义的变量可以全部初始化,也可以部分初始化。对于上面的程序段我们也可以这样写: int r=1; 即定义了整型变量r的同时,对其赋初值为1。 返回到本章目录
赋值的注意事项 在给变量赋值时,应注意以下几个问题: ① 变量在某一时刻只有一个确定的值,变量获得新值后,其原值将不再存在。例如: int r; …… r=1; r=2; 该程序执行后,变量r的值是2,而不是1。 ② 定义多个同类型变量时,如果给所有变量赋同一个值,只能逐个处理。如有三个整型变量x,y,z,且初值均为10,可以写成下面的形式: int x=10,y=10,z=10; ③ 如果变量的类型与所赋数据的类型不一致,所赋数据将被转换成与变量相同的类型。 例如,下面的定义是合法的: int x=10.5; long y=99; 该程序执行后,变量x的值是整数10(只将整数部分赋给变量x),变量y的值是长整数99。 返回到本章目录
4.常量 常量又称常数,是指在程序运行过程中其值不能改变的量。C语言中的常量又分字面常量和符号常量。字面常量又称直接常量,就是常说的常数。字面常量可以分为不同的类型,有整型常量、实型常量、字符型常量与字符串常量。 返回到本章目录
(1)整型常量 整型常量又称整数,在C语言中,整数可以用三种数制来表示: ① 十进制整常数:十进制整常数没有前缀。其数码为0~9。 ② 八进制整常数:八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7。八进制数通常是无符号数。 ③ 十六进制整常数:十六进制整常数的前缀为0X或0x。其数码取值为0~9,A~F或a~f。 ④ 整型常数的后缀:在16位字长的机器上,基本整型的长度也为16位,因此表示数的范围也是有限定的。 返回到本章目录
(2)实型(浮点型)常量 实型也称为浮点型,实型常量也称为实数或者浮点数。在C语言中,实数只采用十进制。它有两种形式:十进制小数形式和指数形式。 ① 十进制小数形式。 小数形式是由数码0~9和小数点组成(注意:必须有小数点)。例如:6.789,.789,6.,0.0都是十进制小数形式的合法表示。 ② 指数形式。 指数形式又称科学计数法。由十进制小数加上阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为: 其中a为十进制数,n为十进制整数,其值为 a*10n。 a E n 返回到本章目录
(3)字符型常量 ① 字符常量的定义 字符常量是用单引号括起来的一个字符。例如:'a','A','@', '?'等。 ②字符常量的特点: • 字符常量只能用单引号括起来,不能用双引号或其它括号。单引号只是字符与其它符号的分隔符,或者说是字符常量的定界符,不是字符常量的一部分,当输出一个字符常量时不输出此单引号。 • 字符常量只能是单个字符,不能是多个字符。 • 字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如'5'和5是不同的。'5'是字符常量,不能参与运算。 返回到本章目录
③ 字符型数据在内存中的存储形式及使用方法 每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。 (4)字符串常量 ① 字符串常量的定义 • 字符串常量是用一对双引号括起来的零个或多个字符序列。如: "hello","","abc","123"等。 • 字符串以双引号为定界符,但双引号并不属于字符串。要在字符串中插入双引号,应该借助转义字符'\ "'才行。字符串的长度等于字符串中包含的字符个数。例如字符串"hello"的长度为5个字符。 返回到本章目录
② 字符常量与字符串常量的区别 • 字符常量由单引号括起来,字符串常量由双引号括起来。 • 字符常量只能是单个字符,字符串常量则可以含一个或多个字符。 • 可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C语言中没有相应的字符串变量。这是与BASIC 语言不同的。但是可以用一个字符数组来存放一个字符串常量。在数组一章内予以介绍。 • 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符'\0' (ASCII码为0)。这是字符串结束的标志。 返回到本章目录
(5)符号常量 在C语言中,也可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先定义,其一般形式为: 符号常量的特点是: ① 习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。 ② 符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。 使用符号常量的好处是:含义清楚,并且能做到“一改全改”。 #define 标识符 常量 返回到本章目录
练一练 【练习2-1】 请判断下列哪些用户自定义标识符是合法的?( ) A)a&b , 1_xy , e5 , a.b B)exam , x1 ,int ,define C)ram , _mn , 3ep ,x*y D)ch , x_3_1 , z2 ,num 解:因为标识符只能由英文大小写字母,数字和下划线三种字符组成,且开头字母只能由字母和下划线组成。所以只有D中的所有标识符是正确的。注意用户自定义标识符不能是系统的保留字(关键字),而C语言中的int和define是关键字,不能做标识符,也是错误的。 【练习2-2】 下面哪个是合法的字符串常量( ) A)'a' B)'\076' C)"Hello" D)Hello 解:因为字符常量是用一对单引号引起来的一个字符,字符串是用一对双引号引起来的零个或多个字符序列。所以必须得有一对双引号,里面可以有n(n≥0)个字符的序列。所以选择C。而A和B都是字符常量,D可以是一个标识符。 返回到本章目录
【练习2-3】 下面哪个表示浮点数的科学计数表示法是正确的?( ) A)3e2.5 B)1.25e C)3.45e-5 D)e+8 解:因为科学计数法有两点要求:(1)e或E前后必须有数字,(2)e或E后的数字必须是整数。所以答案C是正确的。A错误在于e后的数字为小数,B错误在于e后没有数字,D错误在于e前面没有数字。 【练习2-4】 下面的变量定义及初始化语句哪个是正确的?( ) A)int a=3;b=5; B)int a=3 b=5 C)int a=3,b=5; D)int a==3,b==5; 解:因为变量定义及初始化语句格式是: 类型符 变量名1=初值1,变量名2=初值2,……; 各变量之间用逗号分隔,语句结束标志为分号“;”变量初始化的赋值运算符为“=”,所以正确答案为C。 返回到本章目录
本讲小结 本次课主要介绍基本标识符的定义及其分类情况,C语言的数据类型及各代表符号,siaeof运算符的使用,变量的定义、初始化、赋值,常量的定义与应用。 返回到本章目录
第三讲 运算符与表达式、数据类型的转换 一、算术运算与赋值运算 二、关系运算、逻辑运算与条件运算 三、圆括号运算符、逗号运算符和sizeof运算符 练一练 本章小节 返回到本章目录
一、算术运算与赋值运算 【思考题2-2】有两个变量x、y,x的初始值为9,y的初始值为4,分别求出x与y的和、差、积、商与余数。 (一)程序分析 通过上一讲中我们讲了变量的声明与初始化,可以对变量x与y进行声明与初始化,用变量a、b、c、d、e分别表示x与y的和、差、积、商与余数。 返回到本章目录
(二)编写程序代码 main() { int x=9,y=4,a,b,c,d,e; a=x+y; b=x-y; c=x*y; d=x/y; e=x%y; printf("x+y=%d\nx-y=%d\nx*y=%d\nx/y=%d\nx%%y=%d\n",a,b,c,d,e); } 返回到本章目录
(三)调试程序及运行结果 程序运行结果如下: 返回到本章目录
(1)x/y的结果为2,而不是2.25,这是因为“/”号在C语言中的除法有两种运算:(1)x/y的结果为2,而不是2.25,这是因为“/”号在C语言中的除法有两种运算: 如果两个运算符都为整型变量时,结果为舍去取整。 如果两个运算符中有一个为小数(即浮点型变量)时,结果为正常的小数。 (2)输出“x%y”时,输出的格式“x%%y=%d”。因为“%”为格式化输入输出时的起始字符,所以要在屏幕上输出“%”可以连续打两个“%”,就可以在屏幕上显示一个“%”字符。 返回到本章目录
1.算术运算符及算术表达式 返回到本章目录
(1)求余运算符“%” 又称取模运算符,要求“%”的两侧必须为整型数,它的作用是取两个整型数相除的余数,余数的符号与被除数的符号相同。例如【思考题2-2】中的e=x%y,x的值为9,y的值为4,因此e=x%y即相当于e=9%4,它的结果是1。现在假设x的值为-9,则-9%4的结果就是-1,如果x不变,y为-4,则-9%-4的结果是-1。 返回到本章目录
(2)除法运算符“/” 当两个操作数都是整数时,运算的结果是整数(舍去取整),即表示“整除”。如果参加运算的两个数中有一个是实数,则结果是实数。在【思考题2-2】中,x与y分别是9和4,是两个整数,x/y的结果是2,那么,如果把x定义为:float x=9.0,则x/y的结果就变为2.250000。 返回到本章目录
(3)自增运算符“++”或自减运算符“--” 自增运算符“++”或自减运算符“--的作用是使运算对象的值增1或减1。它们既可以作前缀运算符(位于运算对象的前面),例如++x和—x,也可以作后缀运算符(位于运算对象的后面),例如x++和x--。 • 使用自增运算符或自减运算符,应注意以下几个问题: • ① 使用自增或自减运算符只适合用于整型或字符型变量,而不能用于常量或表达式。例如(x+y)++和++9都是不合法的。 返回到本章目录
② 自增或自减运算符,通常用于循环语句中,使循环语句的值加1或减1,也可以用于指针变量,使指针变量指向下一个地址或前一个地址。 • ③ 在只需对变量本身进行加1或减1而不考虑表达式值的情况下,前缀运算和后缀运算的效果完全相同,否则,结果是有不一样的: • ④ 自增(减)运算符的结合性是“自右向左”。 返回到本章目录
2.赋值运算符与赋值表达式 返回到本章目录 “=”是C语言的赋值运算符,在【思考题2-2】中,语句a=x+y中“=”就是赋值符号,而不是我们数学意义上的“等于号”,数学上的“等于号”(相当于关系运算符中的“比较等于”)在C语言中用“==”表示。 C语言允许在赋值运算符“=”之前加上其他运算符,构成复合赋值运算符。C语言共有10种复合赋值运算符,如下表所示:
注意: (1)赋值运算符和复合赋值运算符的结合方向均为从右到左,优先级只高于逗号运算符,而比其他运算符的优先级都低。 例如:表达式x*=y+2等价于x=x*(y+2)。 赋值表达式是由赋值运算符“=”将一个变量和表达式连接起来的式子。赋值表达式的一般格式为: (2)赋值运算符左边必须是变量。赋值表达式的值就是被赋值后的变量值。如果一个语句中出现多个复合赋值表达式时,从右向左依次进行赋值。 变量名=表达式 返回到本章目录
二、关系运算、逻辑运算与条件运算 【思考题2-3】 输入一个字母,判断它是否是小写字母,若是则转换成大写字母,否则不转换,并输出所得的结果。 (一) 程序分析 在输入一个字符时,先判断它的取值区间,如果是大写字母“A~Z”,则它的ASCII值是65~90,如果是小写字母“a~z”的ASCII码值是97~122,大小写字母ASCII码的差值为32,因此半小写字母转换成大写字母只需将其ASCII码减去32即可,反之将大写字母转换成小写字母只需将其ASCII码加上32即可。 返回到本章目录
(二)编写程序代码 main() { char c; /*定义变量c为字符数据类型*/ printf("\ninput char:"); scanf("%c",&c); /*输入字符c*/ c=(c>='a'&&c<='z')?c-32:c; /*若c在'a'~'z'范围内,转换成大写字母*/ printf("\noutput char:%c\n",c); /*输出转变后的结果c*/ } (三) 调试运行程序 程序运行结果如下: 返回到本章目录
3.关系运算与关系表达式 C语言的关系运算符表 返回到本章目录
使用关系运算符时,应注意以下几个问题: (1)在上述6个运算符中,前4个运算符的优先级高于后两个运算符的优先级。 (2)应将等于关系运算符“==”与赋值运算符 “=”相区别。“==”是关系运算符,用于比较运算,而“=”是赋值运算符,用于赋值运算。 (3)关系运算符的优先级低于算术运算符而高于赋值运算符。它们的结合性是自左至右。 ④ 因为“<”的优先级大于“==”,所以要先进行2<n的运算,结果为1,再进行m==1的运算,结果为0,表达式m==2<n的值为0。 返回到本章目录
4.逻辑运算符与逻辑表达式 返回到本章目录 C语言的逻辑运算符及功能
使用逻辑运算符,应注意以下几个问题: (1)三个逻辑运算符的优先次序为:!(逻辑非)→ &&(逻辑与)→ ||(逻辑或),即逻辑非“!”最高,逻辑与“&&”次之,逻辑或“||”最低。 (2)逻辑非“!”的优先级高于算术运算符,逻辑与“&&”和逻辑或“||”的优先级低于算术运算符和关系运算符,高于赋值运算符。在c>='a'&&c<='z'中,就要先进行“c>='a'”和“c<='z'”的关系运算,再进行逻辑与运算。 (3)逻辑运算符中逻辑非“!”的结合方向是自右至左,逻辑“&&”和逻辑或“||”的结合方向是自左至右。 返回到本章目录
逻辑运算的真假值表 返回到本章目录
5.条件运算符与条件表达式 表达式1 ? 表达式2 : 表达式3 返回到本章目录 条件运算符是由字符“?”和“:”组成的,要求有三个运算对象,是C语言中惟一的三目运算符。条件运算符的优先级高于赋值运算和逗号运算符,而低于其他运算符。其结合性为自右至左。 条件表达式是由条件运算符将运算对象连接起来的式子。它的一般格式为: