470 likes | 680 Views
第二章 C 语言的基本知识. 2.1 字符集和标识符 2.2 变量与常量 2.3 C 语言的数据类型 2.4 整型数据 2.5 浮点数 2.6 字符型数据. 2.1 字符集和标识符. 字符集 字符集是高级语言的编译系统所能识别的字母、 数字、和特殊符号。每种高级语言都有自己特定的字 符集合。 标识符 标识符是用来标识在 C 程序中的变量、常量(指符号常量)、数据类型和函数的。通俗一点说,标识符是程序员为变量、常量或者函数起的名字,它实际上是一个字符序列。. C 语言的字符集合包括:.
E N D
第二章 C语言的基本知识 • 2.1 字符集和标识符 • 2.2 变量与常量 • 2.3 C语言的数据类型 • 2.4 整型数据 • 2.5 浮点数 • 2.6 字符型数据
2.1 字符集和标识符 • 字符集 字符集是高级语言的编译系统所能识别的字母、 数字、和特殊符号。每种高级语言都有自己特定的字 符集合。 • 标识符 标识符是用来标识在C程序中的变量、常量(指符号常量)、数据类型和函数的。通俗一点说,标识符是程序员为变量、常量或者函数起的名字,它实际上是一个字符序列。
C语言的字符集合包括: (1) 大、小写英文字母: A ,B,… ,Z,a,b,…z (2) 数字: 0,1,2,…,9 (3) 运算符: + – * / % > < = & | ? ! ^ ~ (4) 括号: ( ) { } [ ] (5) 标点符号: ' " : ; (6) 特殊符号:\ _ $ # (7) 空白符:空格符、换行符、制表符。
任何一个标识符必须符合下列语法规则: (1) 字母或下划线中的任一字符打头。 (2) 在第一个字符后,可以是任意的数字、字 母、下划线组成的序列。长度不超过8个。 关键字(保留字) 标识符的分类: 特定字 用户定义字
关键字(保留字) 关键字:又称保留字,一般为小写字母。 关键字是C编译程序预先登录的标识符,它们代表固定的意义,用户不能随便使用。 若随便使用,可能出现意想不到的错误,编译能通过,但运行结果不对,且不容易检查错误之所在。
特定字 特定字:具有特殊含义的标识符。它们虽然不是关键字,但是在习惯上把它们看成关键字。所以一般用户定义的标识符也不要使用它们。 特定字包括: define undef include ifdef ifndef endif line
用户定义字 用户按照语法规则定义的标识符。用户定义字可以用来标识用户自己使用的变量,符号常量、数据类型以及函数等。 注意 (1) 不能使用关键字和特定字。 (2) 用户定义字为了标识不同的对象,标识符的前8个(甚至7个)字符要有区别。 (3) 标识符最好有含义。 (4) 避免使用容易混淆的字符。如l与1,0与o, z与2等。 (5)大、小写代表不同的意义。 (6) 尽量不要与某个库函数同名。
2.2 变量与常量 • 变量 变量是由程序命名的一块计算机内存区域,是 用来存储一个可以变化的数值。 • 常量 与变量一样,常量也是存储在内存中的,但是,常量的数值在程序执行过程中不会发生改变。 无名常量(或称文字常量) 符号常量(用预处理命令#define为常量命名)
定义变量 在使用一个变量之前,程序员必须为每个变量起个名字,同时还要声明它的数据类型,以便编译系统根据不同的数据类型为其静态地分配内存空间。我们称之为定义变量。 定义变量的格式为: 类型说明符 变量名表 ; 不定值
2.3 C语言的数据类型 C 语言的数据类型 整型 int 基本数据类型 浮点型 float double 字符型 char 数组以[]为标志 结构struct 构造类型 复杂数据类型联合union 枚举enum 指针类型以 * 为标志
整型短整型short int 长整型long int 普通整型int 浮点型普通浮点型float 双精度浮点型double 字符型char 不同数据类型的数据由于其在内存的存储方式不 同,存储所占的二进制位(bit)大多不相同。即使是 相同类型的数据在不同种类的计算机所占位(bit)数 也不完全相同。
2.4 整型数据 • 整型变量 • 整型常量 • 用printf显示整型数据 • 用scanf输入整型数
按照整型变量所占的二进制位数来分类: short(短整型) int (普通整型) long (长整型) 根据整型变量是否带符号位来分类: 不带符号的整型变量 带符号的整型变量 无符号用关键字unsigned表示 说明整型变量的语法是: 限定词 int 变量名表;
在IBM PC机上,普通整型占 16位(bit),短整型也占 16位(bit),而长整型占32位(bit)。根据整型数据所占的位数,计算一个整型数据能表示的数据的取值范围。 第0位是符号位,如果符号位为0,表示是正整数,从0到15位全为1时表示的数最大。 0111……1 +1=215 15个1 则16bit能表示的最大整数是215 –1 ,即32767。 如果符号位为1,表示是负整数,从0到15位都为0时表示的数最小。 10… … 00 15个0 在计算机中,这个数是-215的补码表示。因此,最 小整数是-215,即 -32768。
整型常量表示: 十进制表示 八进制表示以数字 0开头 十六进制表示以数字0和x开头。 int a,b,c; a = 10; b = 010; c = 0x10; 长整型:要在数字后加上字母L 。 long s; s=10L ;
需要注意的是:如果整型常量超过机器所能表示的范围,则会发生溢出,而在C语言中的整数溢出并不会使程序出错,而是得到一个非正确的值。需要注意的是:如果整型常量超过机器所能表示的范围,则会发生溢出,而在C语言中的整数溢出并不会使程序出错,而是得到一个非正确的值。 int a,b; a = 10000; b = 10000000; 变量b的值会被系统认为是-27008。
用printf显示整型数据 %d 表示把数据按十进制整型输出; %o 表示把数据按八进制整型输出; %x 表示把数据按十六进制整型输出; %u 表示把数据参数按无符号整型输出。 注意: 除了%d,其余的格式都将数据作为无符号数输出。 printf("%ld",100000L); 正确 printf("%d",100000L); 结果 -31072
例2.1 #include "stdio.h" void main() { int x,y,z; x=129, y=0127 , z=0x128; printf("%d,%d,%d\n",x,y,z); printf("%o,%o,%o\n",x,y,z); printf("%x,%x,%x\n",x,y,z); } 运行结果: 129,87,296 201,127,450 81,57,128
例2.2 #include "stdio.h" void main() { int x,y,z; x=-129, y=-0127 , z=-0x128; printf("%d,%d,%d\n",x,y,z); printf("%o,%o,%o\n",x,y,z); printf("%x,%x,%x\n",x,y,z); } 运行结果: -129,-87,-296 177577,177651,177330 ff7f,ffa9,fed8 说明:-0127和-0x128并不是八进制和十六进制常量,“-”实际是运算符; 使用%o和%x显示的常量和变量是无符号数。
使用域宽和对齐方式来控制显示格式 在%和转换说明符之前加整数数字,表示数据显示的域宽; 在%后面加符号“-”,数据显示时左对齐,没有符号“-”,数据显示时右对齐。 printf("%-6x%-6x%-6x\n",x,y,z);
例2.3 #include "stdio.h" void main() { int x,y,z; x=129, y=0127 , z=0x128; printf("%6d%6d%6d\n",x,y,z); printf("%6o%6o%6o\n",x,y,z); printf("%-6x%-6x%-6x\n",x,y,z); } 运行结果: 129 87 296 201 127 450 81 57 128
用scanf输入整型数 scanf是格式输入函数,其功能是按指定的格式将标准输入设备(例如键盘)输入的内容送入变量中。 scanf函数的使用格式: scanf(" 格式信息", 输入项1,输入项2,…); 其中,“格式信息”与printf的用法相似,可以在其中使用%和转换字符来指定数据的输入方式。需要注意的是,输入项必须使用地址,普通变量的地址是在变量名前加取地址符&。
输入整型数据的转换字符有d,o,x,u %d 表示把数据按十进制整型输入; %o 表示把数据按八进制整型输入; %x 表示把数据按十六进制整型输入; %u 表示把数据参数按无符号整型输入。 与printf函数类似,如果希望输入的数据是长整型,需要在转换字符前加l。
例2.4 #include "stdio.h" void main() { int x, y, z1; long z2; scanf("%d%o%x%ld",&x,&y,&z1,&z2); printf("\n%d,%d,%d,%ld",x,y,z1,z2); } 若输入为: 10 10 10 100000↙(回车符) 显示结果为 10,8,16,100000
注意 (1) scanf读入一组整数时,scanf扫视输入信息,跳过空格、tab或换行,寻找下一个输入域。一个输入域就是一个连续的非空白字符的数字串。 例如,若输入为: 782 319 20 ↙(回车符) 38 则输入域有四个。 (2) 格式信息中除了有%开始的转换说明,还可以有普通字符,只是这些字符不是显示在屏幕上的,而是要求使用者在输入数据时,要在相应位置输入相同的字符(除了空格、tab或换行符)。
例2.5 #include "stdio.h" void main() { int x, y, z1,z2; scanf("x=%dy=%oz1=%xz2=%u",&x,&y,&z1,&z2); printf("\n%d,%d,%d,%d",x,y,z1,z2); } 如果输入为: 10 10 10 10↙(回车符) 则显示结果为是0,484,2971,0 正确的输入?
2.5 浮点数 • 浮点变量 • 浮点常量 • 用printf显示浮点数据 • 用scanf输入浮点数
浮点变量 单精度浮点数(float) 双精度浮点数(double) long double 定义浮点变量: float a,b; double c,d; 单精度浮点数和双精度浮点数两者在计算机上的表示方式是完全相似的,只是所占的二进制位数不同,单精度浮点数的有效数字(或称精度)和取值范围与双精度浮点数不同。
浮点数在机器中的表示一般分为三部分:符号位、阶码、尾数。浮点数在机器中的表示一般分为三部分:符号位、阶码、尾数。 32位浮点数的有效数字的个数是7位十进制数字,取值范围为10-38 ~ 1038,64位浮点数的有效数字的个数是15位十进制数字,取值范围为10-308 ~ 10308。不同的机器可能会有一些微小的差别。
浮点常量 小数表示法 127.3 科学计数法 1.273×102 在C语言中,实际上也是用这两种方式,只不过102 用E+2表示。 C程序中的浮点常数由整数部分、小数部分、指数 部分构成。 浮点常量构成规则是: (1) 整数部分可以不写,小数部分也可以不写,但不能同时不写。 (2) 指数部分可以省略(相当于使用小数表示法) (3) 若有指数部分,e(或E)两边都至少有一位数。 (4) 指数的数字必须是整数(范围为1到3位的整数),可以为负或正,正号可以省略。
例如, 4.50E3、1.0、1.、.1234、123.4都是合法的浮点常量。 注意: 浮点常量在存储时按double类型存储,即占32位(bit)。 浮点常量也象整型常量一样,如果浮点常量超过机器所能表示的范围,则会发生溢出。 浮点溢出也不会使程序出错,而是得到一个非正确的值 。
用printf显示浮点数据 %f显示小数表示的普通浮点数 %e显示科学记数法表示的浮点数 输出双精度(double)类型时,还需要在转换字符 前加上字母l。 输出浮点数时控制输出域宽和有效位: 在%与f(或e)之间加上两个数字并在两个数字之间加一个句点“.”。 例如,%10.3f表示输出格式是域宽10,有效位3。 注意 : 域宽的含义、缺省有效位、与数据本身的域宽的关系
例2.6 #include "stdio.h" void main() { float x; double y; x=12.3456789;y=987654.321098; printf("\n%e,%le",x,y); ① printf("\n%f,%lf",x,y); ② printf("\n%.3f,%.3lf",x,y); ③ printf("\n%14.3f,%14.3lf",x,y); ④ printf("\n%-14.3f,%-14.3lf",x,y); ⑤ printf("\n%8.3f,%8.3lf",x,y); ⑥ printf("\n%14f,%14lf",x,y); ⑦ }
用scanf输入浮点数 例2.7 void main() { double x, y; scanf("%lf%le",&x,&y); printf("\n%lf,%lf",x,y); printf("\n%le,%le",x,y); } 若输入为 123.56789 1.2345678e17 则运行结果为: 123.567890,123456780000000000.000000 1.234568e+3,1.234568e+17
2.6 字符型数据 • 字符变量 • 字符常量 • 用printf显示字符 • 用scanf输入字符 • 用getchar输入字符和用putchar输出字符 • 字符串常量
字符变量 数据类型说明符 char 例如, char aloha,beta,c; 一个字符变量能存储一个字节的信息,每 个字符有固定的编码,最常用的就是ASCII 编 码。 标准ASCII编码是把每个字符和与0~127的 数值联系起来,用7位二进制表示,再将最高位 充0,就是一个字节了。 例如,在ASCII编码表中,A用数值65表示, 其8位二进制表示是: 01000001
字符常量 C语言中的字符常量是用单引号将一个字符括起 来。例如'a'、'b'。可以用字符常量为字符变量赋值: char alpha='a'; char beta='b'; 注意: (1)引号中的字符只能是一个字符。 (2)不能用双引号括起一个字符表示单个字符常量。 (3)非图形字符,如退格,换行等,也可以表示成字符 型常量。表示方法是使用转义符\与一些特殊字符构成转 义序列。例如‘\n’就是一个转义序列,表示“回车换行”。 (4)字符型数据可以像整型数据一样参与四则运算。 ' b'-' a'=1 98-97=1
用printf显示字符 使用转换说明%c就可以输出单个字符了。 例2.8 #include "stdio.h" void main() { char c='H'; char d='I'; char e='!'; printf("%c%c%c\n",c,d,e); } 运行结果为: HI!
用scanf输入字符 %c 控制输入单个字符。 注意: 尽量不要将%c与其它转换说明一起使用。 当scanf读入一组数据时,如果不使用%c做转换时, scanf扫视输入信息,跳过空格、tab或换行,寻找下一 个输入域。 但是若使用%c做转换时,情况则不同,scanf不会 跳过空格、tab或换行,而是直接把下一个字符输入给参 数,不论它是什么。
例如, scanf("%d%c",&i,&c); 键盘输入 29 w c的内容不是字符‘w’,而是空格。 解决的方法是在控制字符串中加空格分隔。 scanf("%d %c",&i,&c);
用getchar输入字符和用putchar输出字符 getchar()函数的用法 getchar()是接收一个从标准输入输出设 备上输入的字符。 一般的标准输入设备是键盘。 该函数没有参数,函数返回的数据类型为整型, 值为字符的ASCII码值。
例2.9 #include "stdio.h" void main() { int c; c=getchar(); printf("%c",c); }
putchar()函数的用法 putchar()是向标准输入输出设备上输出一个字符, 一般的标准输出设备是屏幕终端。 putchar()与getchar()不同,输出字符做为函数的参数,放在括号里。所以括号里的内容是不能缺省的。 putchar()函数返回的数据类型为整型,值为字符的 ASCII码值。
若想输出字符a,可以用几种方式? int c ; c='a'; putchar( c); 以及 putchar('a'); 和 putchar(97); 对于不可打印的字符,输出方式有两种: putchar(007) ; 和 putchar('\007');
例2.10输入一个字符,按字符原封不动输出。 #include "stdio.h" void main() { int c,i; c=getchar(); i=putchar(c); } 或者 #include "stdio.h" void main() { putchar(getchar()) */ } 什么叫“系统的仿效返回”?
字符串常量 用双引号括起来的字符序列是字符串常量。 "how are you" "1234.5" 字符串的存储与字符不同。C编译程序在存储字符 串常量时自动采用\0作为字符串结束标志。 "how"实际上所占的字节数是4。 “a”与‘a’是完全不同的,前者是字符串常量,占的字节数是2,后者是字符常量,占的字节数是1。 字符串常量的输出 printf("how are you"); printf("%s","how are you");