每种语言都有自己的一套符号,
符号是组成程序的基本单位,它是由若干字符组成的具有一定意义的最小词法单元,如标识符、关键字、运算符、分隔符、常量、注释符等。这里组成符号的字符必须是这种语言字符集中的合法字符,在C++中规定了一个自己的字符集。
2.1 C++字符集字符是可以区分的最小单位,也是组成词法符号的基本单位。C++的字符由下列字符组成。
1、大小写英文字母
a~z,A~Z
2、数字字符
0~9
3、特殊符号
空格 ! # % ^ & * _ - + = ~ > / \ | . , ; ? ' " ( ) [ ] { }
2.2 词法符号(简称符号)C++共有6种词法符号,分别为
1、标识符
标识符是程序员定义的词法符号,用它来命名程序中的一些实体。常见的有函数名字、类名、变量名、常量名、对象名、标号名、类型名等。C++规定
标识符由大小些字母、数字符号和下划线组成,第一个字符必须是字母和下划线。定义标识符有一定的要求
(1) 标识符长度没有限制,但不同的编译系统有不同的要求,一般不超过31。
(2) 第一个字符必须是字母或下划线。
(3) 标识符中大小写是有区别的。XY,xy,xY,Xy都是不同的标识符。
(4) 标识符定义时应尽可能是用有意义的单词。
(5) 标识符不能与关键字相同。
(6) 中间不能有空格。
2、关键字
关键字是系统预留的词法符号。都有不同的用途和含义。
书上给出了ANSI标准的关键字(32个)及一些VC扩展的一些关键字(29个)。
3、运算符
运算符实际上是系统预定义的函数名字,这些函数作用于被操作的对象,将获得一个结果值。这部分内容在后面将详细介绍。
4、分隔符
分隔符又称标点符号。用来分隔单词和程序正文的。C++常用分隔符有:
(1)空格符:用来做单词之间的分隔。
(2)逗号:变量说明时分隔多个变量。
(3)分号:作为语句结束时的标记。在for 语句后面括号中三个表达式也用到分号。
(4)冒号:用作语句标号,在switch语句中也会使用到。
(5){ }:用来构造程序
5、常量
c++中,常量有数字常量、字符常量、字符串常量。
6、注释符
前面已经讲过,有
两种方法,一种是C++语言新增的注释方法,即
以//开头,
占一行。另外就是原来C语言的注释方法,
以一对/*和*/括起的注释信息。
2.3 基本数据类型类型是对系统中的实体的一种抽象,它描述了某种实体的基础特性,包括值的表示、存储空间的大小以及对该值的操作。C++的数据类型包括基本数据类型和构造数据类型两类。构造数据类型又称复合数据类型,它是一种更高级的抽象。当变量被定义为某种类型时会受到系统对该类型的特别保护,确保其值不受非法操作。
C++语言的基本数据类型有如下四种:
·整型,说明符为int;
·字符型,说明符为char;
·浮点型(又称实型),说明符为float(单精度),double(双精度);
·空值型,说明符为void,用于函数和指针。
为了满足各种情况的需要,除了void型外,上述的三种类型前面还可以加上修饰符改变原来的含义。
signed 表示有符号
unsigned 表示无符号
long 表示长型
short 表示短型
上述4种修饰符都适用于整型和字符型,只有long 还适用于双精度浮点型。
数据类型规定的存储空间都是按字节算的,其占用的字节数会根据机器字长的不同会有所变化。也就是说,变量所占空间的大小与被定义的类型和机器有关。所以要注意那些类型会受机器的影响。
类型
说明
长度(字节)
备注(16位)
16位机
32位机
char
字符型
1
1
-128~127
unsigned char
无符号字符型
1
1
0~255
signed char
有符号字符型
1
1
-128~127
int
整型
2
4
-32768~32767
unsigned [int]
无符号整型
2
4
0~65535
signed [int]
有符号整型
2
4
-32768~32767
short [int]
短整型
2
2
-32768~32767
unsigned short [int]
无符号短整型
2
2
0~65535
signed short [int]
有符号短整型
2
2
-32768~32767
long [int]
长整型
4
4
-2147483648~2147483647
signed long [int]
有符号长整型
4
4
-2147483648~2147483647
unsigned long [int]
无符号长整型
4
4
0~4294967295
float
浮点型
4
4
-3.4*1038 ~3.4*1038
double
双精度型
8
8
-1.7*10308 ~1.7*10308
long double
长双精度型
10
10
-3.4*104932 ~1.1*104932
例如:下面是16位与32位计算机的几种数据类型比较。
说明:上面括号中的int 可以省略,即在int之前有修饰符的可以省略int。
在设计程序时,如果要确定某种数据类型所占的字节数,可以利用sizeof函数。例如:
cout
2.4 常量常量是在程序中不能被改变的量。
常量有各种不同的数据类型,不同数据类型的常量由它的表示方法决定,
常量被存储在不能被修改的匿名变量中,常量或常量符号可出现在表达式中。下面介绍各种不同数据类型常量的表示方法。
1、整型常量
整型常量可以用十进制、八进制和十六进制来表示。
(1)十进制整型常量由0至9的数字组成,没有前缀,不能以0开始,没有小数部分。有正负之分。例如:234,-76等
(2)八进制整型常量,以0为前缀,其后由0到7的数字组成,没有小数部分,不能带符号。例如:0357,072等。
(3)十六进制整型常量,用0x或0X为前缀,其后由0到9的数字和A到F(大小写均可)字母组成,没有小数部分,不能带符号。例如:0x7A,0x8ef等。
整型常量中的长整型用L(或l)做后缀表示。例如,32786L。
整型常量中的无符号型用U(或u)做后缀表示。例如,4365U。
整型常量后缀可以是U和L(u或l)的组合,表示unsigned ling 类型的常量。
2、浮点型常量
浮点型常量是由整数部分和小数部分组成的,只有十进制表示。
浮点型常量有两种表示方式:一种是小数表示法,它由整数部分和小数部分组成的。这两部分可省去一部分,但不能都省去。如:5. ,.32 ,0.0,13.54等。另一种方法是科学表是法,他常用来表示很大或很小的数,表示方法是在小数表示法后加e(E)及指数部分。但要注意,
e(E)前面必须有数字,指数部分可正可负,但都是整数。例如,3.2E-5,5.8E10,3e6等。
与整型常量一样,可以定义float和double型两种变量。
在默认情况下,实型常量都为double型,如果要定义float型变量,则必须在实数后加f(F)。表示long double 则必须在实数后加l(L)。例如:
3.2f //float
3.2e2f //float
12.0e-4 //double
76.4L //long double
实型常数分为单精度(float)、双精度(double)和长双精度(long double)3类。一般float型占4个字节,提供7位有效数字。double型占8个字节,提供15位有效数字。long double型占10个字节,提供19位有效数字。
3、字符常量
字符常量是用单括号括起来的一个字符。
有两种表示方法,一种是用该字符的
图形符号,如'a' ,'x','*','1','A'。另外还可以用字符的ASCII码表示,即用反斜符(\)开头,后跟字符的ASCII码,这种方法也称为
转义序列表示法,具体方法是:
有两种形式:一种是用字符的八进制ASCII码,表示为:
\ddd
这里,ddd是八进制值。另一种使用字符的十六进制ASCII码值,表示为
\xhh
这里hh是两位十六进制值。如:'A' ,'\101' 和 'x41'都表示同一个字符常量。
转义序列表示法还可以用来表示一些特殊字符,用来显示特殊符号或控制输出格式。下面是常用的特殊转义字符。
字符形式
ASCII值
功 能
\a
0x07
响铃
\n
0x0a
换行
\t
0x09
制表符(横向)
0x0b
竖向跳格
\v
0x0b
竖向跳格
\b
0x08
退格
\r
0x0d
回车
\\
0x5c
字符\
\”
0x22
字符”
\’
0x27
字符’
\ddd
可表示任意字符
\xhh
可表示任意字符
注意:特殊转义字符必须是小写字母。
4、字符串常量
字符串常量一对双括号括起来的字符序列。例如:
"How are you?"
"ABCD\n"
"a"
"\tabc\txyz!\
mnp\tefg!"
都是字符串。在最后一个字符串中的反斜线是续行符,它表示下面一行的字符与上面是同一行的。使用续行符可使一行写不下的文本写在下一行中。在使用续行符时系统会忽略续行符本身以及其后的换行符。在字符串中出现反斜线时应该用转义字符\\表示。
字符串中可以出现空格符、转义序列或其他字符,也可以包含C++以外的字符,如汉字等,只要编译器支持汉字系统就行。
关于字符常量与字符串常量的区别。
(1)字符串是用一个一维字符数组来存放的,而字符常量可用一个字符型变量存放。例如:
char ch;
ch='a'; 正确
ch="a";错误
(2)字符型常量用单引号括起,而串常量用双引号括起。
(3)一个字符常量被存放在内存中只占一个字节,而串常量要占多个字节。例如: 'a'仅占一个字节,用来存放字符a的ASCII码;而"a"却占两个字节,除了用一个字节存放字符'a'的ASCII码外,还有一个字节存放字符串常量的结束符'\0',这里的'\0'表示空字符的转义序列。要记住,在C++中,凡是字符串都有一个结束符,该结束符用'\0'表示。
(4)字符常量与字符串常量的操作功能也不相同。例如,字符常量具有加法和减法运算,而字符串常量不具有这种运算。例如:
'p'-'m'+1
这是合法的。
"p"-"m"+1
是非法的。
字符串常量有连接、拷贝等功能,在本书的后面进行讲解。
5、枚举常量
枚举常量是枚举类型的值。这种类型一般不常用,在此仅做简单介绍。
学过高级语言的都知道:除了系统预定义的数据类型之外,其他数据类型都要先定义才能使用。枚举类型也是这样,必须先定义,后使用。枚举类型的定义如下:
enum 〈类型名〉 {枚举类型常量表};
其中,enum是关键字,类型名和枚举类型常量都是标识符。
例如:enum day {sun,mon,tue,wed,thu,fri,sat};
默认情况下每个枚举类型常量都对应一个整型序号,第一个常量的序号为0,其后的值依次加1。另外在枚举类型定义时还可显式给枚举类型常量赋值,但必须是整型。例如:
enum day {sun=7,mon=1,tue,wed,thu,fri,sat};
下面定义三个枚举类型变量。
enum day d1,d2,d3;
这里d1,d2,d3只能赋值sun,mon,tue,wed,thu,fri,sat中之一。例如:
d1=tue;d2=sun;d3=d1;
而不能赋值为整型常量,例如,下面赋值是错误的。
d1=3;d2=7;
如果要把序号3对应的常量赋值给枚举类型变量,必须进行强制类型转换。例如:
d3=(enum day )3;
6、符号常量(常量定义)
在C++中的常量常用符号常量来表示,即用一个与常量相关的标识符来代替常量出现在程序中,这种相关的标识符称为符号常量。例如用pi表示圆周率3.1415926,在程序用用到圆周率时就用pi代替。符号常量定义方法如下:
const 〈类型〉〈符号常量〉=〈表达式〉;
如:const float pi=3.1415926;
注意:
常量标识符在程序中只能被引用,而不能被重新赋值。既不能出现在表达式的右边。
2.5 变量变量是在程序执行中其值是可以变化的量。变量有三个要素:名字、类型和值。
1、变量的名字
变量的名字是一个标识符,在组成的变量名字中大小写是不同的。c++虽然未对变量名的长度进行控制,但它受使用的编译系统的制约。一般情况下,变量名用小写字母。注意定义的变量名不要与关键字、库函数名、类名和对象名相同。
2、变量的类型
变量在使用前必须先定义,指出其数据类型。通过类型定义,变量被分配固定的存储空间,直到程序结束时存储空间被释放。变量的操作受类型控制,如整型变量与浮点型变量的操作是不同的。
3、变量的值
与变量有关的有两个值:一个是变量所表示的数据值,另一个是变量的地址值。例如:
char c;
c='a';
其中,第一个语句是定义一个变量,其名字为c,其类型为字符型。第二个语句是给变量c赋值,使变量所表示的数据值为'a',该值便是存放在变量c的内存地址中的值,
实际上内存中存放的是字符a的ASCII码值,以整数表示,所以c++中整型数据和字符型数据之间可以相互赋值,但要注意其表示的合理范围。例如:下面赋值操作是正确的。
int a='x';
char ch=41;
变量c被定义以后,它就在内存中对应着一个内存地址值,在c++中许多操作是针对变量的地址进行的,在指针类型一章将详细介绍。
4、变量的定义与初始化
看下面例子。
#include
void main( )
{
int a;
char ch;
for (ch='a' ;ch
{
a=ch;
cout
}
}
程序输出什么结果?
答:将输出97,98,...,122
在c++中,任何一个变量在被引用之前必须被定义。c++中变量可以在程序中随时定义,不必集中在程序之前。
定义格式:
〈类型〉〈变量名表〉;
当有多个变量时,其间用逗号隔开。例如:
int i,j,k;
float x,y,z;
char c1,c2,c3;
注意:在同一个内存块中不允许定义同名变量,即不允许重复定义一个变量。
变量在定义时可直接给变量一个初始值,称为变量初始化。变量初始化也可放在需要的时候进行。变量被初始化后其值将保存到被改变为止。变量定义以后,如果没有被初始化,并不意味着这个变量中没值,该变量中要么是默认值,要么是无效值。在后面将要讲到,对外部和静态变量定义后其默认值对int型的为0,对浮点型的为0.0;对char型为空。而其他内部变量未初始化时其值是无效的,这是因为该变量所在地址中的内容是先前保留下来的无意义的值。
在定义变量时可一次初始化多个变量。例如:
float x,y=3.14,z=0.0;
char ch1='a'; ch2='\n';
这里,y,z,ch1,ch2在定义的同时就进行了初始化。而x只是做了变量说明并没有赋初值。
2.6 typedeftypedef用来为已存在的类型名提供一个同义词。格式:
typedef ;
2.7 简单I/O操作在程序中经常需要将数据输出到屏幕、打印机、存储器等。也经常需要从键盘接受用户输入的数据,这种输入输出操作统称为I/O操作。在这里将简单介绍键盘和屏幕操作。
在C++中把数据的I/O称为数据流,并提供了强大的“流”处理功能,以控制数据从一个位置流向另外一个位置。相对于内存,当数据从内存流向屏幕、打印机或硬盘时称为输出;当数据从键盘、硬盘流向内存时称为输入。C++用两个对象cin和cout实现标准的输入输出。
cin:它是istream类的对象,用来处理标准输入,即键盘输入。
cout:它是ostream类的对象,用来处理标准输出,即屏幕输出。
在C++中用istream类和ostream类的派生类iostream控制输入输出,并提供了输入和输出操作符。>称为抽取操作符,其作用是从cin流中提取字符。
在此简单介绍一下屏幕的输入输出方法。
1、使用提取符实现键盘输入
格式如下:
cin >> >> ...;
这里抽取符可连续使用,后跟表达式,表达式通常是获得输入值的变量或对象。例如:int a,b;
cin >>a >>b;
要求从键盘上输入两个int型数。在键盘上输入
43 20
这时,变量a获取值为43,变量b获取值20。
说明:从键盘上输入数值时两个值之间一般用空格分隔,也可以用tab键或换行符。
2、使用插入操作符和cout实现屏幕输出
格式如下:
cout ...;
与>>一样,插入操作符可连续使用,后跟表达式,在输出时系统自动计算表达式的值并插入到数据流中。例如:
cout are you !"
看下面例子:
#include
#include
void main( )
{
cout of \"this is a string\" is :\t"
cout \"this is a string\" is :\t"
}
执行该程序输出如下结果:
The length of "this is a string" is : 16
The size of "this is a string" is : 17
3、控制输出格式
许多情况下,都需要控制输出结果的表现形式。如输出宽度、输出精度、输出格式等。C++的iomanip.h中定义了许多控制符,这些控制符可以直接插入到流中,控制数据的输出格式。控制符有两种:控制常量和控制函数,控制常量定义在iostream.h中,控制函数定义在iomanip.h中。常用控制符见下表。
控制符
描述
备注
dec
hex
oct
按10进制输出
按16进制输出
按8进制输出
常量控制符
在iostream.h中
setfill(c)
setprecision(n)
setw(n)
setiosflags(ios::fixed)
setiosflags(ios::scientific)
setiosflags(ios::left)
setiosflags(ios::right)
setiosflags(ios::skipws)
setiosflags(ios::uppercase)
setiosflags(ios::lowercase)
设填充字符为c
设置显示小数精度为n位
设域宽为n个子符
小数方式表示
指数表示
左对齐
右对齐
忽略前导空白(用于输入)
16进制数大写输出
16进制数小写输出
函数控制符
在iomainip.h中
注意:除了setw(n)控制符之外,其他控制符对后面的所有输出起控制作用,直到改变输出格式为止。
例1、输出8进制和16进制数
常量dec、hex和oct用来控制必须按10进制、16进制或8进制形式输出。
#include
void main( )
{
int number=1234;
cout
}
结果为:
Decimal:1234
Hexadecimal:4d2 173c44
Octal:2322 5636104
注意:由于这三个标识符已经被定义为系统常量,注意不能在定义为其他变量使用。
例2、设置值的输出宽度
函数setw(n)用来控制输出宽度,如果数据实际宽度大于设置宽度,将按实际宽读输出;如果设置宽度大于实际输出宽度,数据输出时将在前面补相应数量的空格。另外,该控制符只对一次输出起作用。
#include
#include
void main( )
{
int number=1234;
cout
}
输出结果为:
1234_ _ _1522756
例3、设置填充字符
setfill(c)函数用来设置填充的字符,默认情况下为空格。
#include
#include
void main( )
{
int number=1234;
cout
}
输出$$1234$1522756
例4、设置对齐格式
函数setiosflags(ios
::left)和setiosflags(ios
::right)用来控制输出左右对齐格式。当数据实际宽度小于输出宽度时该控制才起作用。默认情况下数据输出是右对齐。
#include
#include
void main( )
{
int number=1234;
cout
}
输出1234$$1522756$
例5、控制浮点数显示
函数setprecision(n)可用来控制输出流显示浮点数的数字个数(整数部分加小数部分)。c++默认的流输出数值的有效位是6。当小数截短显示时,进行四舍五入处理。函数setflags(ios::fixed)用来控制符点数是按纯小数方式显示,函数setflags(ios::scientific)用来控制符点数是按科学记数法方式显示。系统默认为纯小数方式输出。函数setiosflags(ios::showpoint) 用来强制显示小数点和符号。#include
#include
void main( )
{
float x=20.0/7; y=18.0/6;
cout
cout
cout
cout
cout
cout
cout
}
输出结果为:
2.85714 (默认6位,整数部分加小数部分)
2.857143e+000 (默认6位,指小数部分)
2.857142857142857e+000 (double型最多15位)
2.85714285714286 (double型有效位最多15位,整数部分加小数部分)
3 ( 无小数位)
3 (默认0不输出)
3.00000 (强制输出0)
2.8 标准输入输出函数printf与scanf在程序设计中输入输出是不可缺少的内容,因此在C语言中提供了printf与scanf标准函数来满足输入输出要求。需要说明的是,在C++中提供了更方便的输入输出控制,这就是I/O流。但为了满足一些对printf与scanf使用习惯的要求,C++中仍保留了这两个函数。
一、printf函数
格式:
printf (格式控制字符串,输出项1,输出项2,…)
说明:
(1)格式控制字符串决定了数据输出的结果。它由
“格式说明字符”和“普通字符”组成。普通字符按原样输出,格式说明字符将对应输出数据转换成指定的格式输出。格式控制字符串的形式为:
%[域宽]格式字符
域宽部分是可选的,每个格式说明对应于一个输出参数,该参数被转换成由格式说明规定的数据格式后输出。例如:
#include
void main()
{
int a=10;
float b=-5.2;
printf("a=%d,b=%8.3f",a,b);
}
输出结果如下:
a=10,b= -5.200
(2)格式说明字符及其规定的输出格式
printf的格式说明字符见下表
格式说明符
参数类型
输出格式
d,i
int
十进制整数
o
int
八进制数(无前导0)
x,X
int
十六进制数(无前缀0x或0X)
u
int
无符号十进制数
c
int
单个字符
s
char *
字符串(必须以’\0’结束或给定长度)
f
double
小数形式的的浮点数(小数位数由精度决定,缺省为6位)
e,E
double
标准指数形式的浮点数(小数位数由精度决定,缺省为6位)
%
不转换
输出一个%
域宽说明字符
域宽说明字符
意义
-
在指定的区域内以左对齐方式输出(无’-’号时为右对齐)
+
输出正值时前面冠以符号+
空格
输出的第一个字符不是符号时,要输出一个空格做前缀
0(零)
在域宽范围内用前导0填补空位
#
对于o格式输出前导0,对于
x或X输出
0x或0X前缀。
m(正整数)
指出输出数据的最小宽度。
.(小数点)
分隔域宽与精度,小数点前面可以没有与宽说明
n(正整数)
数据输出的精度即小数部分的位数,
h
指出输出数据是短整型
l
指出输出数据是长整型
L
指出输出数据是高精度浮点型(long double)
ÿ例1
#include
void main()
{
int a=10;
float b=-5.2;
printf("a=%#o,b=%08.3f",a,b);
}
输出结果为:
a=012,b=-008.200
ÿ例2
#include
void main()
{
int a=28,b=38;
long c=289868;
printf("%5d,%5d\n%ld\n",a,b,c);
printf("%3ld\n%7ld\n%d\n",c,c,c);
}
这是书上的例子(28页)。在32位机输出结果与书上的不一样。
28, 38
289868
289868
289868
289868 //16位机输出27724
ÿ例3
#include
void main()
{
int a=-3;
printf("%d,%o,%x,%X,%6x\n",a,a,a,a,a);
}
在16位机上输出结果为:
-3,177775,fffd,FFFD,fffd
在32位机上输出结果为:
-3,37777777775,fffffffd,FFFFFFFD,fffffffd
ÿ例4
#include
void main()
{
char ch='a';
int a=65;
printf("%c,%d,%3c\n",ch,ch,ch);
printf("%c,%d,%3d\n",a,a,a);
}
输出结果为:
a,97, a
A,65, 65
ÿ例5
#include
void main()
{
printf("%3s,%-5.3s,%5.2s\n","hello","hello","hello");
}
输出结果为:
hello,hel , he
说明:第一个"hello"按%3s输出,由于"hello"长度超过3,因此按实际长度输出。第二个"hello"输出宽度为5,且从前面截取3个字符左对齐输出,第三个"hello"的输出宽度仍为5,从"hello"中截取2个字符右对齐输出。
二、scanf函数
一般形式:
scanf(格式控制字符串,地址1,地址2,…);
说明:格式控制字符串同前面的printf函数。地址是指变量的地址,格式是变量的前面加&符号。
例如:
#include “stdio.h”
void main()
{
int i;
printf(“please input i:\n”);
scanf(“%d”,&i);
printf(“i=%d”,i);
}