C语言第二章数据描述与基本操作.docx
- 文档编号:9622434
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:25
- 大小:57.11KB
C语言第二章数据描述与基本操作.docx
《C语言第二章数据描述与基本操作.docx》由会员分享,可在线阅读,更多相关《C语言第二章数据描述与基本操作.docx(25页珍藏版)》请在冰豆网上搜索。
C语言第二章数据描述与基本操作
第二章数据描述与基本操作
1.教学内容:
§2.1数据类型
2.1.1数值的定点表示形式与浮点表示形式
2.1.2字符类型数据的表示和存储形式
2.1.3数据的存储空间长度及取值范围
2.1.4带符号的数据类型与无符号的数据类型
§2.2常量和变量
2.2.1直接常量和符号常量
2.2.2直接常量的书写格式
2.2.3变量和对变量的赋值
2.2.4变量的声明
2.2.5标识符
§2.3运算符与表达式
2.3.1算术运算
2.3.2关系运算、逻辑运算与条件运算
§2.4不同类型数据间的转换
2.4.1几个概念
2.4.2不同类型数据的隐式转换
2.4.3不同类型数据的显式转换
§2.5数据的输入和输出
2.5.1printf函数
2.5.2scanf函数
2.5.2getchar函数和putchar函数
2.教学目的及要求:
1)理解常量和变量
2)掌握数据类型的表示、存储及转换
3)掌握各种运算关系
4)掌握数据输入/输出函数:
printf、scanf、getchar、putchar
3.教学重点:
数据类型转换、各种运算关系、数据输入/输出函数。
§2.1数据类型
数据是程序的组成部分,也是程序的对象。
数据类型是对程序所处理的数据的“抽象”。
C语言提供的每个数据类型有:
2.1.1数值的定点表示形式与浮点表示形式
数据的表示形式:
(以π值为例)
日常的表示形式
C语言中的表示形式
3.14159×100
3.14159e0
31.4159×10-1
31.4159e-1
0.314159×101
0.314159e+1
从上C语言中数的表示形式看,以指数形式表示的数可表示成两部分:
数值和指数。
对0.314159e+1而言,“0.314159”为数值部分,又称尾数,“e+1”是指数部分,“+1”又称阶码。
不带指数部分的数称为定点数。
如:
10,-20,1992等。
一个定点数用两个字节存储,都用来表示数值,没有表示指数部分的阶码。
带指数部分的数称为浮点数。
如:
0.314159e+1等。
在计算机内部,实数(以小数形式表示的数)都以浮点数形式存储,一个实数用4个字节存储,其中三个字节存放数值部分,一个字节存放指数部分(阶码)。
2.1.2字符类型数据的表示和存储形式
字符类型的数据,在内存中以相应的ASCⅡ代码存放。
用1个字节存储。
1、字符型变量可用整数形式输出。
[例]:
ch=’A’;
printf(“%d”,ch);
2、字符数据还可以作为整数参加运算。
[例]:
ch=’a’;
x=ch+32;
printf(“%d”,x);
3、字符型数据和整数在一定范围内是互相通用的。
2.1.3数据的存储空间长度及取值范围
数据类型及长度,如下表:
长度
类型
1个字节
2个字节
4个字节
8个字节
字符型
Char
整型
Short(微机int)
Long(大中小型机int)
实型
float
double
数据类型的取值范围及精度,如下表:
整型
实型
short
long
float
double
-32768
-2147483648
±(3.4E-38~3.4E+38)
±(1.7E-308~1.7E+308)
~+32768
~+2147483648
六位精度
十六位精度
2.1.4带符号的数据类型与无符号的数据类型
整型数存储时,一般以其最高位表示数的符号位,以0表示正,1表示负。
但数值是以补码形式存放的,一个正数的补码是该数的二进制数;一个负数的补码是(求补码):
①取该数的绝对值,②表示成二进制数,③对其取反,④加1。
如果没有特别说明,均默认为带符号整型数,隐含signed(带符号)。
C语言也允许使用无符号整数,最高位用来表示数值,则其表示的数的最大值将扩大一倍。
字符型数据也分为signed和unsigned。
标准ASCⅡ字符的允许范围0~127,用7位二进制表示,最高位(0或1)对其没有影响,对于扩允字符(128~255)因不同计算机系统,处理方法而有所不同,主要是为了方便与整型数进行运算。
实型数无signed和unsigned之分,均带符号。
基本类型数据归纳情况,如下表:
类型
类型标识符
长度(字节)
字符型
[signed]char
1
[unsigned]char
1
整型
[signed]short[int]
2
Unsignedshort[int]
2
[signed]long[int]
4
Unsignedlong[int]
4
实型
float
4
double
8
为了测定某一种类型数据所占存储空间的长度(字节),C语言提供了测试函数,格式为:
sizeof(类型标识符)
如:
printf(“int:
%dBytes”,sizeof(int));
§2.2常量和变量
常量是指在程序执行过程中其值不会发生变化的量。
变量是指在程序执行过程中其值可能发生变化的量。
实际上是内存中指定的存储单元。
2.2.1直接常量和符号常量
直接常量就是常数,从字面直接可知其值,又称字面常量。
如:
area(3.0)。
符号常量是在一个程序中指定的用名字代表的常量,从字面不能直接看出其值。
[例]:
求圆面积和周长的程序。
#defineR3.0
main()
{
doublearea(floatr),circumference(floatr);
printf(“area=%f\n”,area(R));
printf(“circumference=%f\n”,circumference(R));
}
doublearea(floatr)
{
return(3.14*r*r);
}
doublecircumference(floatr)
{
return(2*3.14*r);
}
2.2.2直接常量的书写格式
㈠整型常量
C语言中,整型常量可使用十、八、十六进制数等形式表示。
规则:
以数字0开头的数字序列为八进制数;以0X开头,后跟若干位数字序列为十六进制数;其它形式的数字序列为十进制数。
【例】:
345,0345,0X345
在C语言中规定:
整型数后加字母l或L,则为长整数(longint)。
㈡实型常量
实型常量只能用十进制形式表示,可用小数或指数形式。
不分单精度型和双精度型,但可赋给一个float(7位)型或double(17位)型变量,即赋值兼容。
㈢字符常量
字符常量用定界符---单引号(不能用双引号)括起来。
注意:
单引号中不能有单引号或反斜杠(\)。
如:
’A’,’\’错误
㈣转义字符
以"\"开头的字符序列,称为“转义序列”,“\”使其后面的字符变为另外的意义。
转义字符表如下:
字符形式
功能
\n
换行符
\t
横向跳格:
跳到下一个输出区(每一输出区为8个字符位置)
\v
竖向跳格
\b
退格
\r
回车(回到本行起始字符位置)
\f
走纸换页
\\
反斜杠字符\
\'
单引号(撇号)'
\ddd
1~3位八进制数所代表的字符。
如\101表示'A'
\xhh
1~2位十六进制数所代表的字符。
如\x41表示'A'
【例】:
main()
{
charch;
ch=’\362’;
printf(“%C”,ch);/*将八进制数362的ASCII字符赋给ch*/
}
运行后显示:
≥
至于其它ASCII字符,可查ASCII表。
㈤字符串常数
字符串常数:
用一对双引号括起来的字符序列(0~N个字符)。
如:
"Howdoyoudo.","CHINA","a","$123.45"
字符串常数在内存中的存放:
每一个字符均以其ASCII码存放,且其末尾添加一个字符串结束标志---转义字符“\0”,即“空字符”(二进制00000000,记为NULL或\0),表示“空操作”。
[例]:
"CHINA"存放在内存中的情况是:
(6字节存储器,不是5字节)
C
H
I
N
A
\0
实际存储时用ASCII值存放:
067
072
073
078
065
0
注意:
字符和字符串常数是有区别的。
如:
字符'a':
1字节(值为97)
字符串"a":
2字节(值为97,0)
另外:
charc;
c='a';/*字符'a'赋给C*/
c="a";/*字符串"a"赋给C,错误*/
2.2.3变量和对变量的赋值
1、变量说明
变量是在程序运行过程中,其值可以被改变的量。
变量用标识符(以字母、数字、下划线组成,且第一个字符必须为字母或下划线)表示。
变量在内存中占据一定的存储单元(往往是连续的)。
变量的类型表明所需存储单元的数量(如,整型变量int,占2字节存储单元。
单精度实数float占4字节)及数值范围。
可以用运算符“&”取得存储单元的地址。
如下:
floata;
地址存储单元
&a=6300
6301
6302
6303
01001101
……
……
……
2、变量的赋值
赋值是指向变量所代表的存储单元传送数据的操作。
C语言中规定用“=”表示赋值操作。
一般表示形式为:
变量=表达式
如:
a=2;a=a+1;b=a;a=a+b;b=a=3+5
(即b=(a=3+5))
说明:
①“=”不是数学意义上的等号;
②赋值运算方向从右向左;
③可对变量自右向左连续赋值(d=c=b=a=3+5)。
2.2.4变量的声明(定义)
C语言对变量的规定:
“先声明、后使用”。
因为:
①编译程序不能翻译未定义变量。
②编译程序在编译时根据变量类型确定存储单元的数量。
③编译程序在编译时根据变量类型进行语法检查。
一、变量的声明
⑴不同类型的数据在内存中占据不同长度的存储区,且表示方式也不同;
⑵一种数据类型对应着一个值的范围;
⑶一种数据类型对应着一组允许的操作。
如:
整型数可以进行“求余”运算,9%4。
(结果为1)
二、在变量声明时对变量指定初值
在定义变量的同时指定其初值。
例:
inta=3;
floatf=3.56;
charc='a';
inta,b,c=5;/*指定c的初值为5,未指定a、b的初*/
注意:
多个变量指定相同的初值。
inta=b=c=3;
inta=3,b=3,c=3;
指定初值是在程序运行时完成的(不是在编译时完成)。
定义方法
相当的语句
inta=3;
inta;
a=3;/*运行时执行赋值语句*/
inta,b,c=5;
inta,b,c;
c=5;
2.2.5标识符
标识符是一个名字,是给程序中的实体---变量、常量、函数、数组、结构体以及文件所起的名字。
可由设计者自己指定,也可由系统指定。
C语言中命名的规则为:
⑴以字母或下划线开头,由字母、数字或下划线组成的字符序列;
⑵C系统定义的关键字(32个)不能用作标识符;
⑶C系统内部使用的下划线开头的标识符不能使用;
⑷C语言对标识符的长度没有规定(最好不要超过8个字符);
⑸C语言将大写字母和小写字母认为是两个不同的字符。
⑹定义标识符时,建议遵循下面规则:
①尽量做到“见名知义”;
②变量保、函数名用小写,符号常量用大写;
③在容易混淆的地方,避免使用容易认错的字符。
如:
0(数字)--O(大写字母)--o(小写字母)
1(数字)--I(i的大写)---l(L的大写)
2(数字)--Z(大写字母)---z(小写字母)
§2.3运算符与表达式
C语言中的运算符有如下13种:
算术运算符
+-*/%
关系运算符
><==>=<=!
=
逻辑运算符
!
&&||
位运算符
<<>>~|∧&
赋值运算符
=
条件运算符
?
:
逗号运算符
,
指针运算符
*&
求字节数运算符
sizeof
强制类型转换运算符
(类型)
分量运算符
.(点)->
下标运算符
[]
其他
函数调用运算符()
注意事项:
⑴运算符的功能;
⑵与运算量的关系
.要求运算量的关系:
双项(双元、双目)、单项
(一元、一目);
.要求运算量的类型;
⑶运算的优先级别;
⑷结合方向:
“自左至右”、“自右至左”等;
⑸结果的类型:
表达式的值类型。
2.3.1算术运算
㈠双元算术运算符
运算符
名称
示例
+
加法
如:
3+5
正值
如:
+3
-
减法
如:
5-2
负值
如:
-3
*
乘法
如:
3*5
/
除法
如:
5/3
%
模运算(求余)
如:
7%4
一般情况,双元运算表达式为:
c=aopb
使用了三个变量,如:
c=a+b
㈡自反算术赋值运算
为了节省存储空间,C语言提供了一种压缩方式的运算表达形式:
aop=b如:
a+=b。
称它为自反算术赋值运算符。
主要有:
-=(自反减赋值)、*=(自反乘赋值)、/=(自反除赋值)、%=(自反模赋值)
自反运算虽然提高了简洁性、程序的效率,但造成阅读和理解程序的困难,建议有限制地使用,或用圆括号加以说明。
如:
c=b*=a+2写成c=(b*=(a+2))
意为:
b=b*(a+2);c=b;
㈢自加和自减运算
自加:
使变量的值加1;
自减:
使变量的值减1。
运算结合方向:
自右向左,且只能对整型变量进行运算。
参阅下表:
形式
运算
说明
示例
后缀方式
i++
在使用i之后使i加1
j=3;先引用后增值
j=i++;/*先把i赋给j,再使i加1。
执行:
j=3,i=4*/
i――
在使用i之后使i减1
前缀方式
++i
在使用i之前使i加1
j=3;先增值后引用
j=++i;/*先使I加1,
再赋给j。
执行后:
j=4,
i=4*/
――i
在使用i之前使i减1
注意事项:
1.在表达式中使用++或--,容易出错。
i=3;
k=(i++)+(i++)+(i++);
结果为:
k=3+3+3=9
若k=(++i)+(++i)+(++i)
结果为:
连续3次使i加1后,i的值等于6,k=6+6+6=18
2.出现多个运算符时,编译器在处理时尽可能多的(从左到右)将若干个字符组合成一个运算符。
如:
i+++j;运算顺序为:
(i++)+j;
㈣正负号运算符(结合方向:
自右至左)
正负号运算符为+、-,是一元运算符,优先级高于*、/运算符。
如:
-a*b/*先使a变符号,再与b相乘*/
㈤赋值类运算符的副作用及限制
1、费解、易于误解---对人的副作用
例1:
c=b*=a+2;
例2:
x=i+++j;
应采取的措施:
⑴将费解处分解
将[例1]写成语句:
a=a+2;b=b*a;c=b;
将[例2]写成语句:
x=i+j;i++;
⑵加一些“不必要”的括号
将[例1]写成语句:
c=(b*=(a+2));
将[例2]写成语句:
x=(i++)+j;
⑶加注释说明
将[例1]写成语句:
c=b*=a+2;
/*a=a+2;b=b*a;c=b*/
2、不定解---对机器的副作用
例:
j=3;
i=(k=j+1)+(j=5);
会因(k=j+1)和(j=5)执行的先后次序不同,而得到不同的结果:
9和11。
2.3.2关系运算、逻辑运算与条件运算
关系运算、逻辑运算与条件运算一缆表,如下:
名称
运算符
优先级
关系运算
><==>=<=!
=
后两个小于前四个
逻辑运算
!
(非)&&(与)||(或)
由低到高
条件运算
?
:
㈠关系运算
关系运算优先级低于算术运算,但高于赋值运算。
关系表达式的值只有两个:
成立为“真”,用“1”表示;不成立为“假”,用“0”表示。
如:
z=3-1>=x+1<=y+2可写成:
z=(((3-1)>=(x+1))<=(y+2))
结果:
z=1
注意事项:
⑴要说明x在区间[a,b]中,应写成:
x>=a&&x<=b;
⑵形如6>5>7>8的表达式,应按自左至右求解;
⑶关系表达式的值是整型数1或0,故可将其看成是整型表达式;
例:
a=i+(j%3!
=0);/*当i=2,j=10时,a=3*/
⑷字符数据的比较按ASCII值进行;
⑸在判定两个浮点数据是否相等时,由于存储上的误差,会得出错误结果。
例:
1.0/3.0*3.0==1.0/*关系式值为假,0*/
㈡逻辑运算
通过简单电路来理解逻辑运算关系:
逻辑运算中的规律:
0&&a==00||a==a!
(!
a)==a
1&&a==a1||a==1
0&&!
a==0a||!
a==1
a&&a==aa||a==a
!
(a&&b)==!
a||!
b!
(a||b)==!
a&&!
b
㈢条件运算
条件表达式的一般形式:
e1?
e2:
e3
执行过程:
若e1为真(非0),则条件表达式的值取e2的值;否则取e3的值。
【例】:
输入两数,输出大数。
main()
{
floata,b,max;
printf(“input2realsplease:
”);
scanf(“%f%f”,&a,&b);
max=a>b?
a:
b;
printf(“Themaxis%f\n”,max);
}
§2.4不同类型数据间的转换
2.4.1几个概念
数据类型间的转换有三种形式:
⑴同一类型但长度不同的数据间的转换;
⑵定点方式与浮点方式间的转换;
⑶整型数中的有符号格式与无符号格式间的转换。
涉及数据类型间转换的概念:
㈠提升与降格
.由低级的数据转换为高级的数据,称为数据提升。
包括:
⑴由短数据转换为长数据。
如:
char→short→long→double
⑵由整数转换为浮点数。
如:
long→float,long→double
.与上面相反方向的转换称谓降格。
㈡符号位扩展与零扩展
.将带signed的整型数提升为较长的带signed的整型数时,扩展位的值与原数的符号位相同(即若符号位0,扩展位均为0;若符号位1,扩展位均为1),这称为符号位扩展。
.将unsigned整型数扩展为较长的整型数时,扩展位全置0,这称为零扩展。
㈢最高位失去符号功能与最高位变成符号位
.由signed型转换为同一长度的unsigned型时,原来的符号位变成数据位。
.由unsigned型转换为同一长度的signed型时,原来的最高位变成符号位。
㈣截去小数与四舍五入
.当实数(浮点数)转换为整数时,小数部分全部舍去,并按整型数形式存储。
.当由来double型转换为float型时,去掉多余的有效数字,按四舍五入处理。
㈤丢失精度
四舍五入、截去小数、由long型转换成float或double型时,均有可能全精度受到影响。
㈥结果不确定与截去高位
.浮点数(double)降格时,当数据值超过了目标类型的取值范围时,所得到的结果将是不确定的。
.当较长的整数转换为较短的整数时,要将高位截去。
【例】:
main()
{doublea=123456.78908765;
floatb;
longc;
inti,j;
b=a;c=a;i=a;j=c;
printf(“a=%1f,b=%f,c=%1d,i=%d,j=%d\n”,
a,b,c,i,j);
}
运行结果:
a=123456.789099,b=123456.789062,
c=123456,i=-7616,j=-7616
2.4.2不同类型数据的隐式转换
C语言中数据类型的转换可分为:
隐式和显式两种。
发生隐式转换情况如下:
⑴运算转换:
运算量类型不同;
⑵赋值转换:
赋值类型不同;
⑶输出转换:
输出类型不同;
⑷函数调用转换:
实参与形参类型不同。
㈠一般算术转换
运算符转换通常用于算术运算(+-*/%),通称算术转换。
其目的是:
⑴将短的数扩展成机器处理的长度;
⑵使运算符两端具有共同的类型。
转换原则如下:
①将表达式的char或short全部自动转换为相应的int型;将float转换为double型。
②当一个运算符两端的运算量类型不一致时,按“向高看齐”的原则对“较低”的类型进行提升。
一般算术转换是在运算过程中自动进行的。
如:
…
charch;
inti,result;
floatf;
doubled;
result=ch/i+f*d-(f+i);
…
㈡赋值转换
赋值号右边的表达式值的类型自动转换成其左边变量的类型。
具有强制性。
㈢输出转换
在printf函数中指定输出格式(%d,%f,%0,%u(无符号方式)等)与实际输出数据不甘落后同时,应注意如下几方面:
⑴负数转换为无符号数。
---符号位作数据位。
⑵较长类型转换为较短类型。
---超长时出错。
⑶实数转换成整数。
---实整数超长、小数位丢失。
2.4.3不同类型数据的显式转换
显式转换也称“强制类型转换”,C语言中提供了强制转换一种类型的运算符,其一般形式为:
(类型标识符)表达式
【例】:
(double)a;/*将a转换为double类型*/
(int)(x+y);/*将x+y的值转换为int类型*/
(float)(5%3);/*将5%3的值转换为float类型*/
注意:
(int)(x+y);/*将x+y的值转换为int类型*/
(int)x+y;/*将x的值转换为int类型,再与y相加*/
(int)(x);与(int)x;与int(x);/*int(x)
*/
§2.5数据的输入和输出
C语言提供了多种输入/输出函数,标准I/O函数库中有些公共信息写在头文件stdio.h中,因此,使用标准I/O库函数时,一般应在程序开头先写预编译命令:
#include“stdio.h”
2.5.1printf函数
printf是格式输出函数,它按照指定的格式,在标准输出设备上输出数据。
有两种参数:
格式控制和输出项。
它的一般形式为:
printf(格式控制参数,输出项1,输出项2,……)
格式控制参数也称“格式控制字符串”,由两部分组成:
格式说明和普通字符。
普通字符将被直接输出,而格式说明将引起输出项的转换与显示,其完整格式为:
下面对组成格式说明的各项加以说明:
⑴格式字符
格式字符用以指定输出项的数据类型和输出格式。
如下表:
格式字符
输出形式
举例
d(或i)
十进制整数
intx=23;printf(“%d”,x);
x(或X)
十六进制整数
intx=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 第二 数据 描述 基本 操作