《C语言的基本数据类型和变量的存储类.ppt》由会员分享,可在线阅读,更多相关《C语言的基本数据类型和变量的存储类.ppt(57页珍藏版)》请在三一办公上搜索。
1、第2章 C语言的基本数据类型和变量的存储类,C语言程序设计,C数据类型如下:,变量的概念,变量是指在程序运行过程中可以发生改变的量变量的特征:(1)它有一个变量名,变量名的命名方式符合标识符的 命名规则。(2)变量有类型之分。不同类型的变量占用的内存单元(字节)数不同,因此每个变量都有一个确定的类型。(3)变量可以存放值。程序运行过程中用到的变量必须有确切的值,变量 在使用前必须赋值,变量的值存储在内存中。在程 序中通过变量名来引用变量的值。,变量,变量名和变量值的区别:在程序运行过程中从变量x中取值,实际上是通过变量名x找到相应的内存地址,从其存储单元中取数据30。,变量名与变量值的区别,变
2、量的概念,变量,2.1 整型数据,2.1.1 整型常量 表示形式:计算机中用二进制形式存储数据;为便于表示和使用,整型常量还可以表示成十进制、八进制和十六进制,八进制与十六进制常数,以数字“0”开始的整型常数是八进制数022、-037010和10大小不一样因为八进制并不常用,所以此种表示法比较少见以“0 x”或者“0X”开始的整型常数是十六进制AF和af用来表示十进制的1015十六进制的形式比较常用0 x12、-0 x1F,-0 x1f,2.1.2 整型变量,整型变量类型,2.2.1 字符(Character)常量,字符常数的表示方法a,A,5,%,$单引号内只能有一个字符,除非用“”开头就是
3、一个普通整数,也可以参与各种数学运算每个字符具有一个0255之间的数值,可从ASCII表查出注意:6和整数6的区别字符的数学运算在密码学内用得比较多用“”开头的字符为转义字符例如,n,代表1个字符,转义字符及其含义,2.2.1 字符(Character)常量,分析下面程序的运行结果。#include/*程序需要使用C语言提供的标准函数库*/void main()/*主函数*/printf(Chinan101tn);/*调用库函数printf显示字符串*/,程序运行结果:ChinaA,2.2.1 字符(Character)常量,2.2.2 字符型变量,字符型变量用来存放字符常量,注意只能存放一个
4、字符。字符型变量的类型标识符为char、内存中所占空间字节数为1.例如:char c1,c2,c3,c4,c5;c1=a;正确 c2=“a”;不正确 c3=abc;不正确 c4=107;正确 c5=6;正确,字符型数据的存储表示,字符型数据在C语言中是和整型数据同等对待的。任何一个字符都相当于一个整型量,其值就是该字符的编码值。C语言中凡是整型量可以出现的地方,字符型量都可以出现。对于采用ASCII编码的系统,实际上,C语言在内部将每个字符型量都看作字长为8的整型量。,例如,x的十进制ASCII码是120,y的十进制ASCII码是121。对字符变量a、b赋予x和y值:a=x;b=y;实际上是在
5、a、b所在的两个字节内分别存放整数120和121:,a:,b:,char型与int型之间的关系,注意:1、一个字符型变量占一个字节,只能存放一个字符,存放该字符的ASCII码值;2、由于字符型数据也是以整数形式进行存储,所以它可以以字符形式、整数形式输出;3、常用字符的ASCII码值:0 x20(32)0:0 x30(48)A:0 x41(65)a:0 x61(97),小写字母转换为大写字母,#include main()char ch=b;printf(%c,%dn,ch,ch);ch=b-32;printf(%c,%dn,ch,ch);,#include main()char ch=b;p
6、rintf(%c,%dn,ch,ch);ch=b-(a-A);printf(%c,%dn,ch,ch);,b,98B,66,b,98B,66,2.2.4 字符串(String)常量,用双引号括住的由0个或多个字符组成的字符序列I am a string表示空字符串转义字符也可以在字符串中使用引号只作为字符串开始和结束的标志C语言内部用0表示字符串的结束除注释外,是惟一可以出现中文的地方x和x是不同的,2.3.1 浮点型常量(实型常量),实型常量的表示形式十进制小数形式 123.45、456.78指数形式 1e-2、4.5e3注意:非指数形式由数字和小数点组成123.、+123.、.123都是合
7、法的非指数形式指数形式e或E之前必须有数字(可以是非指数型浮点常量,可以是整数),且e或E后必须为整数。e4、12e2.5都是非法的指数形式,浮点型变量分为单精度型(float)、双精度型(double),浮点型变量类型,浮点型变量(实型变量),误差、实型数据的有效数字位数例,#include main()float a;double b;a=123456.789e4;b=123456.789e4;printf(%fn%fn,a,b);,1234567936.0000001234567890.000000,float型数据提供7位有效数字,double型数据提供17位有效数字,实型数据使用不当
8、会导致舍入误差,求字节运算符,它是一个C语言的关键字,并不是函数,专门用于获取指定类型所占字节数可以用两种形式使用 sizeof(表达式)一般都使用:sizeof(变量名)sizeof(类型)值得注意的是,使用sizeof(表达式)时,不对表达式运算,只判断表达式值的类型。,#include main()printf(Data type Number of bytesn);printf(-n);printf(char%dn,sizeof(char);printf(int%dn,sizeof(int);printf(short int%dn,sizeof(short);printf(long i
9、nt%dn,sizeof(long);printf(float%dn,sizeof(float);printf(double%dn,sizeof(double);,2.5 数据的输入与输出,如何进行数据的输入输出?输入:从标准输入设备上输入数据到计算机内存输出:将计算机内存中的数据送到标准输出设备C语言中输入输出操作通过调用标准库函数来实现,2.5.1 字符输入/输出函数,字符输出函数 putchar(ch)表示输出一个字符,ch可以是一个字符变量或字符常量、整型变量、整型常量或转义字符。如:putchar(ch);字符输入函数 getchar()表示从输入设备接收一个字符,该函数无参数函数值
10、为从输入设备接收的字符如:ch=getchar(),#include main()char ch;printf(Press a key and then press Enter:);ch=getchar();printf(You pressed);putchar(ch);putchar(n);,运行程序,Press a key and then press Enter:,311,A,You pressed,A,例,getchar()函数接收的字符可以赋给一个字符变量或整型变 量,也可以不赋给任何变量,作为表达式的一部分。c=getchar();putchar(c);可以用下面一行语句代替:pu
11、tchar(getchar();getchar()函数只能接收一个字符,即使从键盘上输入多个 字符,也只接收第一个字符。从键盘上输入的字符不能带单引号,输入以回车键(Enter键)结束。,关于getchar()函数的说明和注意事项:,格式输出函数printf(“格式控制字符串”,输出项表列);输出若干个任意类型的数据printf(a=%d b=%f,a,b);,函数名,输出表列,普通字符,2.5.3 格式输出函数,printf函数常用的格式字符,2.5.3 格式输出函数,printf函数常用的附加格式说明符,2.5.3 格式输出函数,%d、%md、%-md、%0md、%ld,分析下面程序的运行
12、结果。#include void main()int x=123;printf(%dn,x);printf(%6dn,x);printf(%2dn,x);printf(%-6dn,x);printf(%06dn,x);,程序运行结果:123123123123000123,d 格式符,用来输出一个字符。有%c、%mc、%-mc等用法。字符数据的输出。#include void main()char c=a;printf(%d%5cn,c,c);,程序运行结果:97a,c 格式符,用来输出一个字符串。有%s、%ms、%-ms、%m.ns、%-m.ns等用法。,程序运行结果:China,China,
13、ChinaCh,Chin,Chi,s 格式符,字符串的输出。#include void main()/*主函数以不同形式输出字符串”China”*/printf(%s,%8s,%3s,China,China,China);printf(%7.2s,%.4s,%-5.3sn,China,China,China);,用来输出实数(包括单精度、双精度),以小数形式输出。有%f、%m.nf、%-m.nf等用法:,f格式符,实数的输出。#include void main()double f=123.456;printf(f=%f,f=%10f,f=%10.2f,f=%.2f,f=%-10.2fn,f,
14、f,f,f,f);,程序运行结果:f=123.456000,f=123.456000,f=123.46,f=123.46,f=123.46,用来以指数形式输出一个实数。有%e、%m.ne、%-m.ne等用法。请以指数形式输出一个实数。#include void main()float f=123456.78;printf(%e,%8.3e,%6.0e,%.1en,f,f,f,f);,程序运行结果:1.234568e+005,1.235e+005,1e+005,1.2e+005,e或E格式符,2.5.4 格式输入函数,格式输入函数 scanf(“格式控制字符串”,输入项地址表列);scanf(%
15、d,%f”,在输入数据时,遇到以下情况认为此数据输入结束。遇到空格、或者按回车键、或者Tab键。遇到指定的宽度结束。例如%3d,只取3位。遇到非法输入。例如:scanf(%3d%d%c%f,若输入:12345g678o.98,输入数据结束处理,scanf函数不能显示提示字符串。因此,在编写程序时,往往先用printf()函数在屏幕上输出提示,告诉要输入的信息项。提示输入的信息项。#include void main()int a,b,c;printf(input a,b,c:n);scanf(%d,%d,%d,程序运行结果:input a,b,c:35,45,55a=35,b=45,c=55,
16、使用scanf函数的注意事项:,在用“%c”格式输入字符时,所有输入的字符(包括空格字符和转义字符)都作为有效字符。scanf函数的“格式控制”后面应当是变量地址,而不是变量名。输入实数时不能规定精度。例如,scanf(%4.1f,如果格式控制中有非格式字符,则输入时也要输入该非格式字符。,使用scanf函数的注意事项:,d 用来输入十进制整数O 用来输入八进制整数x 用来输入十六进制整数c 用来输入单个字符s 输入字符串,以非空白字符开始,遇第一个 空白字符结束f 用来输入实数,可以用小数形式或指数形 式输入e、E、g、G 与f作用相同,e与f、g可以互相替换(大小写作用相同),scanf格
17、式字符,l 加在d、o、x、u前:输入长整型 加在f、e 前:输入双精度型h 加在d、o、x 前:输入短整型m 表示数据占用的宽度*本输入项在读入后不赋给相应的变量,scanf附加格式说明符,在定义变量时就对其赋初值,称为变量的“初始化”。不被初始化的变量,其值为随机数char ch=a;int sum=0;long int i=1;float x=1.0e-5;,2.7 变量的初始化,变量的作用域,变量的作用域指在源程序中定义变量的位置及其能被读写访问的范围(定义变量的位置和变量起作用的范围)分为局部变量(Local Variable)全局变量(Global Variable),局部变量,在
18、函数内部定义的变量称为局部变量。函数内部定义的变量只在该函数范围内有效,不同函数中的局部变量可以重名,互不混淆。,float f1(int a)int b,c;.Char f2(int x,int y)int i,j;main()int m,n;,a,b,c作用范围,x,y,i,j作用范围,m,n作用范围,例,下面程序中包含有复合语句,分析其运行结果。#include void main()int i=2,j=3,k;k=i+j;int k=8;if(i=2)i=3;printf(k1=%dn,k);printf(i=%dnk2=%dn,i,k);,程序运行结果:k1=8i=3k2=5,说明:
19、,1.每个变量仅在定义它的语句块(复合语句)内发挥作用(含下一级语句块);2.若不同语句块变量重名,两个变量互不相干。3.当发生复合语句嵌套时,若外层变量与内层变量重名,则局部优先,全局变量,在函数外定义的变量称为全局变量。作用范围:从定义变量位置开始到本源文件结束。,int p=1,q=5;float f1(int a)int b,c;.char c1,c2;char f2(int x,int y)int i,j;main()int m,n;,c1,c2作用范围,p,q作用范围,程序运行结果:n=5n=10,例,分析下面程序的运行结果#include void fun();int n=5;v
20、oid main()int n=10;fun();printf(n=%dn,n);void fun()printf(n=%dn,n);,说明:,同一源文件中,允许全局变量和局部变量同名。但在局部变量的作用域内,全局变量被“屏蔽”不起作用.,动态存储方式与静态存储方式,指数据在内存中存储的方式即编译器为变量分配内存的方式,它决定变量的生存期动态存储方式在程序运行期间根据需要动态的分配存储空间的方式静态存储方式在程序运行期间由系统分配固定的存储空间的方式,程序区,静态存储区,动态存储区,形参、自动变量、函数调用的现场等,全局变量、静态变量,从变量在内存中存在的时间(即生存期)角度来分,可以分为静态
21、存储变量和动态存储变量。,2.8 变量的存储类,变量两个属性:数据类型、数据的存储类别。自动变量和寄存器变量属于动态存储方式,外部变量和静态变量属于静态存储方式。,自动变量(auto变量),auto 类型名 变量名;说明:缺省auto,默认为自动变量,生存期:随着函数的调用而自动分配内存,调用结束时,自动释放内存。自动变量的初值:定义变量时若没赋初值,变量的初值不确定,寄存器变量(register变量),寄存器CPU的内部容量很有限、但速度极快的存储器使用频率比较高的变量声明为register,可以使程序更小、执行速度更快register 类型名 变量名;register int i;现代编译
22、器有能力自动把普通变量优化为寄存器变量,并且可以忽略用户的指定,所以一般无需特别声明变量为register,静态(static)局部变量,static 类型名 变量名;,生存期 程序编译时分配存储单元,整个程序的执行期间都不释放内存。静态变量的初值 若未赋初值:默认初值为0;若赋了初值:仅在编译时赋初值一次,程序运行后不再给变量赋初值。,注意:,静态局部变量在函数调用结束后其值不消失而保留原值,下次调用时的值为上次调用结束时的值。,例 2.27,#include void main()void increment();increment();increment();increment();void increment()static int x=0;x=x+1;printf(x=%dn,x);,程序运行结果:x=1x=2x=3,在一个文件内扩展外部变量的作用域,用extern声明全局变量,以扩展其在源程序文件中的作用域。#include int x=123;void main()extern int y;printf(“x=%dny=%dn”,x,y);int y=321;,程序运行结果:x=123y=321,