您的位置:首页 > 编程语言 > C语言/C++

C++基本数据类型与输入输出

2007-11-30 17:54 561 查看
每种语言都有自己的一套符号,符号是组成程序的基本单位,它是由若干字符组成的具有一定意义的最小词法单元,如标识符、关键字、运算符、分隔符、常量、注释符等。这里组成符号的字符必须是这种语言字符集中的合法字符,在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 typedef
typedef用来为已存在的类型名提供一个同义词。格式:
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: