一、文字常量:
常量之所以称为“文字常量”,其中“文字”是指我们只能以它的值的形式指代它,“常量”是指它的值是不可变的。同时注意一点:文字常量是不可寻址的(即我们的程序中不可能出现获取所谓常量20的存储地址&20这样的表达式),虽然常量也是存储在内存的某个地方,但是我们没有办法访问常量的地址的。
常量是有类型的:
1、 字符型char:一个字节表示,通常表示单个字符或小整数,字符型常量用一对单引号‘ ’夹着一个字符表示。
(1)可打印字符常量表示:
‘a’ ‘2’ ‘,’ ‘ ’
字符常量在内存中的存储格式依赖于ASCП码表的。
(2)不可打印字符常量,通过斜杠“/”表示:
‘/n’ 换行符 ‘//’ 反斜杠 ‘/t’ 水平制表符 ‘/0’ 空(NULL)字符
2、 整型int:一个机器字长度的整数值。
短整型short:半个机器字长度的整数值。
长整型long:一个或两个机器字长度的整数值。
在32位机器中,int和long通常相同。
(1)上面提到的char字符型,也可看作长度为一个字节的字符型整数。
通过下面这个小例子,可以看到char型数据,不同初始化方法,内存格式也是不同的。
char a=’1’;
cout<<a+1<<endl; //输出结果为50,参照ASC表,字符常量’1’在内存中是十进制数49
char b=1;
cout<<b+1<<endl;//输出结果为2
实际上,字符常量还可以初始化int、long等类型数据,例如:
int c=’1’;
cout<<c+1<<endl;//输出结果也是50
而:
char a=’1’;
cout<<a<<endl;//输出结果为1
int a=’1’;
cout<<a<<endl;//输出结果为49
这些区别需要引起我们的注意。
(2)整数常量可以使用十进制、八进制、十六进制表示,例如
20(十进制)024(八进制)0x24(十六进制,也可写做0X24,“x”大小写无所谓)
(3)整型常量可以有符号,也可以无符号,例如:
一个8位有符号char:-128~127
一个8位无符号char:0~255
说明:缺省的整型常量是int型的,我们可以使用”L”或”l”后缀强制把整型常量表示成long型,另外也可加后缀”U”或”u”指定成无符号数,例如:
128U、1024UL、1L、8Lu
3、 浮点型float:一个字长度的单精度浮点数
双精度double:两个字长度的双精度浮点数
长双精度long double:3个或4个字长度的扩展精度浮点数
(1) 浮点常量可以写成科学计数法或普通十进制数
(2) 浮点常量缺省为double型,可以加后缀“F”“f”“L”“l”修饰为单精度浮点数或扩展精度浮点数,但是只能修饰十进制表示的浮点数。还有跟整型常量不一样的地方是,浮点数部分正负,也就是说不能使用“U”“u”后缀。
例如:3.14159F 0.1f 12.345L 0.0 3e1 1.0E-3 1.0L
4、布尔常量boolean:true或false
5、字符串常量:比较特殊的一种类型,它不是内置或基本的数据类型,实际上就是字符常量数组,它由字符串文字本身以及编译器加上的表示结束的空(NULL)字符组成。
字符串常量“Ab”在内存中的实际格式是’A’’b’’/0’
如果程序中”two””Some”紧邻,C++编译器会把它们连在一起,并在最后加上一个空字符,即输出为”twosome”
字符串常量还可换行表示,只需在换行的地方加上“/”,例如:
“abc/
de/
fgh”
实际上就是表示”abcdefgh”
测试题:
1、 说明下列文字常量的区别:
(a)’a’ L‘a’ “a” L”a”
文字常量’a’表示单一字符,类型为char,L’a’也表示单一字符’a’,只不过它的类型是wchar_t,因为前导词L表示宽字符。
文字常量”a”表示字符串,包含单一字符’a’和空字符’/0’,L”a”也表示字符串,常量宽字符所表示的数组。
(b)10,10U,10L,10uL,012,0xA
均表示十进制数10,区别是表示进制不同以及具体类型不同
(c)3.14 3.14f 3.14L
均表示浮点数3.14,区别是具体类型不同。
2、 下列语句哪些是非法的:
(a) "Who goes with F/144rgus?/014"
合法,/144代表一个d字符,/014代表一个奇怪的字符
(b) 3.14e1L
不能用L修饰科学计数法表示的浮点数
(c) "two" L"some"
合法,但结果没有意义
(d) 1024f
合法
(e) 3.14UL
不合法,不能用U修饰浮点数
(f) "multiple line
comment"
不合法,换行要用/
二、变量
1、简介
变量为我们提供了一个有名字的内存区域,可以通过程序对其读写和处理。C++中的每个符号变量都与一个特定的数据类型相关联,这个类型决定了相关内存的大小,布局,能够存储在该内存区的值以及可以应用在其上的操作集,我们可以把变量说成对象。
变量和常量的异同点:
1、 相同点:
均有存储区,并有相关的类型。
2、 不同点:
常量不能寻址,变量可以寻址
对于每一个变量都有两个值和它关联:
(1)数据值:存储在某个内存地址中,用做右值。
(2)地址值:存储数据值的那块内存地址,用做左值。
例如:ch = ch – ‘0’;
右侧的ch是数据值被读取,而左侧的ch是指地址值被读取。
0 = 1; //错误,常量不能用做左值
salary+salary*0.1 = newsalary;//错误,算术表达式不能用做左值。
变量的定义会引起内存分配,一个变量定义对应一个内存区域,所以不能重复定义同一个变量,但是由于程序需要,可以重复声明,比如:
extern String stringName;
这样的声明最好放在头文件中。
例如:
// file module0.C
// 定义fileName 对象
string fileName;
// ... 为fileName 赋一个值
// file module1.C
// 需要使用 fileName 对象
// 喔: 编译失败:
// 在module1.C 中fileName 未定义
ifstream input_file( fileName );
// file module1.C
// 需经使用fileName 对象
// 声明fileName, 也即, 让程序知道它,
// 但又不引入第二个定义
extern string fileName;
ifstream input_file( fileName );
2、变量的定义:
由类型标志符后面跟一个名字构成,以分号结束:
double salary;
double wage;
int month;
int day;
int year;
unsigned long distance;
也可以写成:
double salary,wage;
int month,day,year;
unsigned long distance;
关于初始化:全局域内的变量定义时,用户若不初始化,系统会自动初始化为0,而如果是局部域内定义的或由new动态分配的,系统会初始化为随机数。
C++支持两种初始化:
(1) 显式
int iVal = 1024;
String project = “Fantasia”;
(2)隐式
int iVal(1024);
String project(“Fantasia”);
另外,逗号分隔的标志符列表也能为每个对象提供显式的初始值,如:
doubld salary=9999.99,wage=salary+0.01;
还有,每种内置的数据类型都支持一种特殊的构造函数语法,可将对象初始化为0,例:
int iVal=int();//0
doubld dVal=double();//0.0
Vector<int> iVec(10);//10个0
测试题:
1、下列定义哪些是非法的请改正之
(a) int car = 1024, auto = 2048;
(b) int ival = ival;//没有什么实际意义
(c) int ival( int() );
(d) double salary = wage = 9999.99;//wage使用前未曾先定义,在这条语句前加上一条语句double wage=9999.99就没问题了
(e) cin >> int input_value;//使用cin时,不能同时定义
2、说明下列 student 和 name 两个实例的区别
(a) extern string name;
string name( "exercise 3.5a" );
(b) extern vector<string> students;
vector<string> students;
第一行是name的声明,告诉编译器name代表的类型为String,未进行内存分配
第二行是name的定义,告诉编译器name代表的类型为String,并进行内存分配。
3、下列名字哪些是非法的请改正之
(a) int double = 3.14159; //无效 使用了保留字
(b) (b) vector< int > _;
(c) string namespace; //无效,使用了保留字
(d) (d) string catch-22;//内含一个无效的-
(e) char 1_or_2 = '1';//名称不能以数字开头
(f) float Float = 3.14f;
4、下面的全局对象定义和局部对象定义有什么区别(如果你认为有区别的话)
string global_class;
int global_int;
int main() {
int local_int;
string local_class;
// ...
}
两个String对象都是被其缺省的构造函数初始化,另外全局变量global_int被初始化为0,而局部变量local_int不会初始化,是任意值。但是使用VC.NET调试时,输出没有初始化局部变量会编译失败,提示使用没有初始化的变量。但输出没有初始化的全局变量就没有问题,因为系统帮助初始化为0了。