1、字符集及词法约定字符集及词法约定2.1常常 量量2.2简简 单单 变变 量量2.3基本数据类型及其转换基本数据类型及其转换 2.4printfprintf和和scanfscanf函数的一般使用函数的一般使用2.5 本章介绍有关数据类型的最基本的内本章介绍有关数据类型的最基本的内容,包括表示方式、取值范围及一般转换容,包括表示方式、取值范围及一般转换规则等。另外也简要介绍常用库函数规则等。另外也简要介绍常用库函数printf()和和scanf()的一般使用格式。的一般使用格式。2.1.1 字符集字符集(1)数字:我们平常使用的)数字:我们平常使用的10个十进制数个十进制数字:字:0,1,9。(2
2、)字母:大、小写英文字母各)字母:大、小写英文字母各26个:个:A,B,Z和和a,b,z。大、小写字母是有区别的,表示不同大、小写字母是有区别的,表示不同的字符。的字符。(3)图形符号:)图形符号:29个图形(可见)字符,个图形(可见)字符,即:即:!#%&()*+,/;:?_|(4)转义序列。表)转义序列。表2-1列出了列出了C语言源程序语言源程序中常用到的一些转义序列及其含义。中常用到的一些转义序列及其含义。字字 符符 名名表示形表示形式式含含 义义备备 注注换行换行n把打印(显示)位置移到下一行的起始位置把打印(显示)位置移到下一行的起始位置水平制表水平制表t把打印位置移到当前行的下一个
3、制表点(通常是把打印位置移到当前行的下一个制表点(通常是右移右移8个字符的间隔)个字符的间隔)与实现有关与实现有关表表2-12-1转义序列及其含义转义序列及其含义字字 符符 名名表示形式表示形式含含 义义备备 注注垂直制表垂直制表v把打印位置移到下一行制表点起始位置把打印位置移到下一行制表点起始位置与实现有关与实现有关退格退格b把打印位置在当前行上向后退一个字符位置把打印位置在当前行上向后退一个字符位置与实现有关与实现有关回车回车r把打印位置移到当前行的起始位置把打印位置移到当前行的起始位置换页换页f把打印位置移到下一个逻辑页开头的起始位置把打印位置移到下一个逻辑页开头的起始位置报警报警a产生
4、可听或可见的报警,位置不变产生可听或可见的报警,位置不变与实现有关与实现有关问号问号?打印问号打印问号单引号单引号打印单引号打印单引号双引号双引号打印双引号打印双引号反斜线反斜线打印一个反斜线打印一个反斜线续表续表(1)标识符)标识符 在在C语言中,用来标记常量、变量、语言中,用来标记常量、变量、数据类型、函数及程序的名字。必须符合数据类型、函数及程序的名字。必须符合下列语法规则:下列语法规则:应以字母(大小写皆可)或下线符(应以字母(大小写皆可)或下线符(_)中任一个字符开头。中任一个字符开头。在第一个字母后,可以是任意字母、下在第一个字母后,可以是任意字母、下线符和数字组成的字符序列,此序
5、列可为线符和数字组成的字符序列,此序列可为空串。空串。根据以上规则,下列字符序列是合法根据以上规则,下列字符序列是合法的标识符:的标识符:NAME1 name1 Total_5 Paper _i3 _out 而以下字符序列不是合法的标识符:而以下字符序列不是合法的标识符:NAME 1 中间留有空格,它不是字中间留有空格,它不是字母数字串母数字串name$2 中间有中间有$,此为非字母、数字字,此为非字母、数字字符符5t 开头的是数字,而不是字母开头的是数字,而不是字母$4 开头的是一般字符,不是字母开头的是一般字符,不是字母 程序中的标识符必须选择恰当。程序中的标识符必须选择恰当。在选择标识符
6、时,要尽量避免使用容在选择标识符时,要尽量避免使用容易混淆的字符。易混淆的字符。C语言区分大、小写字母,所以语言区分大、小写字母,所以name1、Name1和和NAME1可在同一程序中使用,各可在同一程序中使用,各代表不同的变量。代表不同的变量。标识符的最大长度还受实现的限制。标识符的最大长度还受实现的限制。(2)关键字)关键字 在有些语言中关键字又称作保留字。在有些语言中关键字又称作保留字。它是具有特定含义、专门用作语言的特定它是具有特定含义、专门用作语言的特定成分的一类标识符。不能当作一般标识符成分的一类标识符。不能当作一般标识符使用。使用。表表2-2列出列出C语言的全部关键字及其用语言的
7、全部关键字及其用途。途。关关 键键 字字类类 型型用用 途途char数据类型数据类型字符量字符量int整型量整型量long长整型量长整型量short短整型量短整型量float单精度浮点量单精度浮点量double双精度浮点量双精度浮点量unsigned无符号量(最高位不作符号位)无符号量(最高位不作符号位)signed有符号量有符号量struct结构型量结构型量union联合型量联合型量enum枚举型量枚举型量void无值量无值量const常量常量volatile易变量易变量auto存储类存储类自动量自动量extern外部量外部量static静态量静态量register寄存器量寄存器量typed
8、ef类型命名类型命名表表2-22-2关键字及其用途关键字及其用途关关 键键 字字类类 型型用用 途途ifif流程控制流程控制条件语句条件语句elseelse条件语句的另一种选择条件语句的另一种选择forforforfor循环语句循环语句whilewhilewhilewhile和和do-whiledo-while循环语句循环语句dododo-whiledo-while语句语句breakbreak间断语句间断语句continuecontinue接续语句接续语句gotogoto跳转语句跳转语句returnreturn返回语句返回语句switchswitch多路选择语句多路选择语句defaultdef
9、ault多路选择语句中的默认情况多路选择语句中的默认情况casecase多路选择语句中的情况选择多路选择语句中的情况选择sizeofsizeof运算符运算符计算字节数计算字节数续表续表(3)标点符号)标点符号 C语言中标点符号是表示语法的符号,语言中标点符号是表示语法的符号,共有共有13个,即:个,即:()*,:=;#程序中往往要用到一些预先给定值的程序中往往要用到一些预先给定值的量,并且在程序执行过程中其值不再发生量,并且在程序执行过程中其值不再发生变化。变化。这类数据一般称为常量。这类数据一般称为常量。C语言中有不同类型的常量,如整型语言中有不同类型的常量,如整型常量、浮点常量、字符常量和
10、字符串常量。常量、浮点常量、字符常量和字符串常量。常量在常量在C语言中出现的形式一般有两语言中出现的形式一般有两种:一种是在程序中直接使用给定的值,种:一种是在程序中直接使用给定的值,2和和3.1415926都是固定不变的量,而且直接都是固定不变的量,而且直接以值的形式出现。这种形式的常量往往称以值的形式出现。这种形式的常量往往称为字面量。为字面量。另一种形式是采用宏定义形式,例如:另一种形式是采用宏定义形式,例如:#define PI 3.1415926 经过宏定义之后,就用标识符来代表经过宏定义之后,就用标识符来代表字面量,这种形式的常量通常称为符号常字面量,这种形式的常量通常称为符号常量
11、。符号常量的名字往往用大写字母,不量。符号常量的名字往往用大写字母,不能把符号常量名当作变量使用。能把符号常量名当作变量使用。在在C语言中,整常量分为十进制整常语言中,整常量分为十进制整常量、八进制整常量和十六进制整常量。普量、八进制整常量和十六进制整常量。普通整常量在机器中占一个字长。通整常量在机器中占一个字长。1十进制整常量十进制整常量 十进制整常量是带正负号的整数。如十进制整常量是带正负号的整数。如12,2008,10001,39。八进制整常量是以数字八进制整常量是以数字0开头的八进制开头的八进制数字串,其中只能出现数字数字串,其中只能出现数字07。通常,。通常,它是无符号数(即没有正负
12、号的数)。它是无符号数(即没有正负号的数)。十六进制整常量是以十六进制整常量是以0 x或或0X开头的十开头的十六进制数字串,可用的数字有六进制数字串,可用的数字有09,af或或AF。(1)无符号型后缀)无符号型后缀 无符号型后缀用小写字母无符号型后缀用小写字母u或者大写字或者大写字母母U表示(表示(unsigned int)。)。例如,例如,986u,07654u,0XFEDu等都等都是无符号整常量。是无符号整常量。(2)长型后缀)长型后缀 长型后缀用小写字母长型后缀用小写字母l或大写字母或大写字母L表表示(示(long int)。例如:)。例如:62l,0123L,0 x327l等。等。如果
13、一个整常量后面同时带有后缀如果一个整常量后面同时带有后缀l(L)和)和u(U),那么,它的类型就是),那么,它的类型就是unsigned long int(无符号长整型)。例(无符号长整型)。例如如:9999lu,077777LU等。等。它有以下两种表示形式。它有以下两种表示形式。(1)十进制数形式)十进制数形式 例如:例如:3.14,0.618,.618,10.0,123.等都是合法的浮点常量。在这种形式中,等都是合法的浮点常量。在这种形式中,一个浮点常量是由数字和小数点组成。必一个浮点常量是由数字和小数点组成。必须有小数点,并且小数点的前面或者后面须有小数点,并且小数点的前面或者后面必须有
14、数字。必须有数字。(2)指数形式)指数形式 例如:例如:2.98e6(或(或2.98E6),),3.0e8(或(或3.0E8),),6.E5,6e5,.123E+4等都等都是合法的浮点常量。在这种形式中,必须是合法的浮点常量。在这种形式中,必须带有阶码标志带有阶码标志e(或(或E),并且),并且e之前必须有之前必须有数字,数字,e之后的指数必须是整数。之后的指数必须是整数。如果浮点常量不带后缀,那么它的类如果浮点常量不带后缀,那么它的类型就是双精度型(型就是双精度型(double)。若在浮点常)。若在浮点常量后面带有后缀量后面带有后缀字母字母F或或f,那么它的,那么它的类型就是单精度浮点型(类
15、型就是单精度浮点型(float),通常简),通常简称为浮点型。在浮点常量后面还可带有后称为浮点型。在浮点常量后面还可带有后缀缀字母字母l或或L,此时,它的类型就是长,此时,它的类型就是长双精度型(双精度型(long double)。在一般系统中,)。在一般系统中,单精度浮点数占用单精度浮点数占用4个字节(个字节(32位)的存储位)的存储单元,而双精度浮点数占用单元,而双精度浮点数占用8个字节。个字节。在在C语言中,字符常量是用单引号括语言中,字符常量是用单引号括起来的一个字符或字符序列,如起来的一个字符或字符序列,如 x、AB、9、*等。等。除以上形式外,构成字符常量的字符除以上形式外,构成字
16、符常量的字符还可以是转义序列。在还可以是转义序列。在C语言中转义序列语言中转义序列有三种:简单转义序列、八进制转义序列有三种:简单转义序列、八进制转义序列和十六进制转义序列。和十六进制转义序列。(1)简单转义序列)简单转义序列?a b f n r t v 虽然在形式上它们是由两个字符构成虽然在形式上它们是由两个字符构成的,却只代表一个字符。的,却只代表一个字符。(2)八进制转义序列)八进制转义序列 它是由反斜线它是由反斜线和后随的一个、两个或和后随的一个、两个或三个八进制数字构成的,如:三个八进制数字构成的,如:014、75、6等。等。(3)十六进制转义序列)十六进制转义序列 它是由反斜线它是
17、由反斜线、字母、字母x和后随的一个、和后随的一个、两个或三个十六进制数字构成,如:两个或三个十六进制数字构成,如:x9、x1A、x123等。等。上述八进制转义序列和十六进制转义上述八进制转义序列和十六进制转义序列在构成形式上虽然出现多个字符,但序列在构成形式上虽然出现多个字符,但在相应的字符常量或字符串常量中却只代在相应的字符常量或字符串常量中却只代表一个字符。如表一个字符。如014、xB9等都分别是一等都分别是一个字符的含义。个字符的含义。字符常量的类型是字符常量的类型是int。它的值就是该字符在相应字符集中的它的值就是该字符在相应字符集中的编码值。编码值。字符常量可像其他整数一样参与数值字
18、符常量可像其他整数一样参与数值运算。运算。在语言中,用在语言中,用0表示空字符表示空字符NUL,在机器中存放时它所占字节的各位都是在机器中存放时它所占字节的各位都是0,因而它的值也是因而它的值也是0。要注意,空字符不是空。要注意,空字符不是空白字符。还应注意白字符。还应注意0与与0的区别。空字符的区别。空字符常用来标识一个字符串的结尾。常用来标识一个字符串的结尾。它是用一对双引号括起来的零个或多它是用一对双引号括起来的零个或多个字符组成的序列,如:个字符组成的序列,如:Hello!This is a character string1234567890(在双引号中没有任何字符)(在双引号中没有
19、任何字符)字符串常量也可以看成是一个数组,字符串常量也可以看成是一个数组,这个数组的元素为一个一个的字符。这个数组的元素为一个一个的字符。编译程序在编译源文件时会自动在每编译程序在编译源文件时会自动在每个字符串末尾放上空字符个字符串末尾放上空字符“0”,作为字,作为字符串的结尾,这种方式也表明:在符串的结尾,这种方式也表明:在C程序程序中,对字符串的长度不加限制。中,对字符串的长度不加限制。一个字符串究竟有多长,要到达结尾一个字符串究竟有多长,要到达结尾字符字符“0”时才能确定。时才能确定。每个字符串所需要的实际空间要比用每个字符串所需要的实际空间要比用户给出的字符数多一个字节。户给出的字符数
20、多一个字节。x就不同于就不同于x。前者是单独一个字。前者是单独一个字符,而后者是一个字符串,它包含了两个符,而后者是一个字符串,它包含了两个字符:字母字符:字母“x”和一个空字符和一个空字符“0”。变量是在程序执行过程中其值可以改变量是在程序执行过程中其值可以改变的量。变的量。在程序中使用一个变量之前,先要对在程序中使用一个变量之前,先要对它进行定义:为它指定一个名称(变量它进行定义:为它指定一个名称(变量名),指明它是什么类型的变量等。变量名),指明它是什么类型的变量等。变量名应是合法的标识符。名应是合法的标识符。int i;int j;int k;同时对几个有相同类型的变量进行定同时对几个
21、有相同类型的变量进行定义,也可以简写在一行中,如:义,也可以简写在一行中,如:int i,j,k;注意,注意,int与与i之间有空格,各变量名之之间有空格,各变量名之间要用逗号隔开,最后一个变量名后面要间要用逗号隔开,最后一个变量名后面要用分号结尾。用分号结尾。在在C语言中定义变量的一般形式是:语言中定义变量的一般形式是:数据类型数据类型 变量名;变量名;或者或者数据类型数据类型 变量名变量名1,变量名,变量名2,;定义变量时,还应注意以下几点。定义变量时,还应注意以下几点。不同类型的变量应在各自数据说明行上不同类型的变量应在各自数据说明行上定义,不要把它们统统写在一行上,以增定义,不要把它们
22、统统写在一行上,以增加程序的可读性。加程序的可读性。在程序的同一部分,不允许对同一标识在程序的同一部分,不允许对同一标识符做重复定义。例如:符做重复定义。例如:1main()23 int a,b,sum;4 float price,sum;5 char a,flag;数据说明语句是以分号结尾,而同一说数据说明语句是以分号结尾,而同一说明语句中各个变量名之间以逗号隔开。例明语句中各个变量名之间以逗号隔开。例如:如:int i,j,k;C C语言数语言数据类型据类型基本类型基本类型字符型字符型整型整型浮点型浮点型双精度型双精度型表表2-32-3C C语言数据类型语言数据类型 C C语言数语言数据类
23、型据类型枚举类型枚举类型枚举型枚举型无值型无值型导出类型导出类型数组数组结构结构联合联合函数函数指针型指针型续表续表 在在C语言中,表示整型量的关键字是语言中,表示整型量的关键字是int,所以一个整型变量,所以一个整型变量i的说明形式为:的说明形式为:int i;在目前大多数实现中,整型变量的取在目前大多数实现中,整型变量的取值范围因机器字长而异。值范围因机器字长而异。在字长为在字长为16位的机器上,整型变量位的机器上,整型变量i的的取值范围是:取值范围是:32768i32767 对它们可以施行如下算术运算:对它们可以施行如下算术运算:+(加)(加)(减)(减)(乘)(乘)(除)(除)(取模)
24、(取模)整数还可使用下述运算符进行关系运整数还可使用下述运算符进行关系运算:算:=!=C语言中与语言中与int有关的类型还有:有关的类型还有:(1)短整型)短整型short int,简写为,简写为short。(2)长整型)长整型long int,简写为,简写为long。(3)无符号整数)无符号整数unsigned int,简写为,简写为unsigned。表示字符型变量的关键字是表示字符型变量的关键字是char。char c;一个字符型变量所占用的内存空间应一个字符型变量所占用的内存空间应足以存放所用基本字符集中任何一个字符,足以存放所用基本字符集中任何一个字符,通常占用一个字节,即通常占用一个
25、字节,即8位。位。在在ANSI C和和ISO C中,还规定了中,还规定了signed char和和unsigned char两种类型,两种类型,unsigned char型量的取值范围是型量的取值范围是0255,而,而signed char型量的取值范围是型量的取值范围是127127。当把一个字符常量赋给一个字符变量当把一个字符常量赋给一个字符变量时,该字符变量的值就是相应字符的编码时,该字符变量的值就是相应字符的编码值。值。在在C语言中字符数据往往可以像整型语言中字符数据往往可以像整型数据那样进行有关运算。数据那样进行有关运算。例例2-1 在在ASCII字符集中,字母字符集中,字母A的序的序
26、号为号为65,分析以下程序的输出结果。,分析以下程序的输出结果。#include main()char x,y;x=A+10;y=Z 20;printf(%c=%d,%c=%d n ,x,x,y,y);return(0);字符数据可以以字符形式输出,也可字符数据可以以字符形式输出,也可以用整数形式输出。以用整数形式输出。表示基本浮点类型的关键字是表示基本浮点类型的关键字是float。float f;C语言中还提供其他两种浮点类型:语言中还提供其他两种浮点类型:double和和long double,分别称作双精度类,分别称作双精度类型和长双精度类型。型和长双精度类型。float量的取值范围是量
27、的取值范围是double量的子集,而量的子集,而double量的取值范围量的取值范围又是又是long double量的子集。量的子集。一般机器上一般机器上float量占量占4个字节(个字节(32位),位),double量占量占8个字节(个字节(64位),而位),而long double量要占量要占16个字节(个字节(128位)。位)。浮点变量可进行的算术运算有下述浮点变量可进行的算术运算有下述4种:种:+*其运算结果仍是一个浮点量。但大家其运算结果仍是一个浮点量。但大家应注意,取模运算符应注意,取模运算符“%”不能作用于浮不能作用于浮点量上。点量上。为了保持运算精度,在运算时所有的为了保持运算
28、精度,在运算时所有的float量都被转换成量都被转换成double量。量。int i=10;float pi=3.14;double f;f=i*pi;不同类型的量在一起进行算术运算时不同类型的量在一起进行算术运算时需进行类型转换。即:如果一个运算符有需进行类型转换。即:如果一个运算符有两个不同类型的运算分量,那么,在操作两个不同类型的运算分量,那么,在操作之前先将之前先将“较低较低”的类型提升为的类型提升为“较高较高”的类型,使二者类型统一,然后进行操作;的类型,使二者类型统一,然后进行操作;其结果是其结果是“较高较高”类型。而类型的高低是类型。而类型的高低是由其属性(取值范围、精度、作用等
29、)来由其属性(取值范围、精度、作用等)来决定的。决定的。由算术运算符对运算分量自动实施的由算术运算符对运算分量自动实施的类型转换称为普通算术转换,也称为隐式类型转换称为普通算术转换,也称为隐式转换。转换。long double double float unsigned long int unsigned long long unsigned int char,short 图图2-1 2-1 算术转换规则算术转换规则 在进行运算之前,所有在进行运算之前,所有char型和型和short型数据都转换成型数据都转换成int型,所有型,所有float型数据都型数据都转换成转换成double型,从而可以
30、提高运算精度。型,从而可以提高运算精度。在赋值语句中,赋值号右边表达式的在赋值语句中,赋值号右边表达式的值的类型要转换成赋值号左边变量的类型。值的类型要转换成赋值号左边变量的类型。例如:例如:int i=10;float pi=3.14;double f;f=i*pi;例例2-2 分析下面程序输出的结果。分析下面程序输出的结果。/*Basic conversions in C*/main()int a,b=550;char c=7;float f1=3.142,f2;a=b/c;/*integer divided by a character*/printf(a=%dn,a););a=f1;/
31、*float to integer conversion*/printf(f1=%fa=%dn,f1,a););f1=b;/*integer to float conversion*/printf(b=%df1=%fnb,f1););f2=b/50.0;/*integer divided by a float*/printf(b=%d,f2=%fn,b,f2););return(0);输出结果是:输出结果是:a=10f1=3.142000a=3b=550f1=550.000000b=550,f2=11.000000 C语言中除上述隐式类型转换外,还语言中除上述隐式类型转换外,还有显式类型转换,
32、这就是利用类型强制转有显式类型转换,这就是利用类型强制转换运算符换运算符“(类型名)表达式(类型名)表达式”形式中的形式中的一对圆括号,强行把其后表达式的类型转一对圆括号,强行把其后表达式的类型转换成圆括号中给定的类型。换成圆括号中给定的类型。(1)printf()函数函数 printf()函数的功能是按指定的输出格函数的功能是按指定的输出格式把相应的参数值在标准输出设备(通常式把相应的参数值在标准输出设备(通常是终端)上显示出来。是终端)上显示出来。printf()的一般使用格式是:的一般使用格式是:printf(格式控制串,参数(格式控制串,参数1,参数,参数2,););例如:例如:pri
33、ntf(The value=%d*%dn,a,b););转转 换换 说说 明明输输 出出 形形 式式应应 用用 例例 子子输输 出出 示示 例例%d%d十进制十进制intint型型printf(sumprintf(sum=%d=%d n,sumn,sum););sum=2008sum=2008%f%f十进制十进制doubledouble型型printf(aprintf(a=%f n,a);=%f n,a);a=6.280000a=6.280000%c%c单个字符单个字符printf(printf(“ItIt is%c is%c n,cn,c););It is MIt is M%s%s字符串字符
34、串printfprintf(*%s%s*n,sn,s););*Hello!Hello!*%o%o无符号八进制数无符号八进制数printf(Octprintf(Oct=%o=%o n,octn,oct););Oct=176Oct=176%x%x无符号十六进制数无符号十六进制数printf(Hexprintf(Hex=%x=%x n,hexn,hex););Hex=96AFHex=96AF%本身本身printf(aprintf(a%b=%d%b=%d n,dn,d););a%ba%b=5=5表表2-62-6printfprintf()()中常用的转换说明及其作用中常用的转换说明及其作用(2)sca
35、nf()函数函数 scanf()函数的功能是接受用户从键盘函数的功能是接受用户从键盘上输入的数据,按照格式控制符的要求进上输入的数据,按照格式控制符的要求进行类型转换,然后送到由对应参数指示的行类型转换,然后送到由对应参数指示的变量单元中去。变量单元中去。scanf()的一般使用格式是:的一般使用格式是:scanf(格式控制串,参数(格式控制串,参数1,参数,参数2,););例如:例如:scanf(%d%f ,&a,&r);转转 换换 说说 明明输输 入入 形形 式式 应应 用用 例例 子子输输 入入 示示 例例%d匹配可带符号的十进制匹配可带符号的十进制整数整数scanf(%d,&a);输入
36、输入100,则,则a为为100%f匹配可带符号的浮点数匹配可带符号的浮点数scanf(%f,&f);输入输入3.14,则,则a为为3.140000%c匹配一个(默认)字符匹配一个(默认)字符scanf(%c,&c);输入输入A,则,则c为为 A%s匹配非空白字符序列匹配非空白字符序列scanf(%s,line);输入输入string,则数组,则数组line中中放置放置string,末尾自动加,末尾自动加上空字符上空字符%o匹配可带符号的八进制匹配可带符号的八进制整数整数scanf(%o,&u);输入输入754,则,则u的值为八进的值为八进制制754%x匹配可带符号的十六进匹配可带符号的十六进制整数制整数scanf(%x,&x);输入输入123,则,则x值为十六进值为十六进制制123表表2-72-7 scanfscanf()()中常用的转换说明及其作用中常用的转换说明及其作用