*********************************************************
原文:http://www.cplusplus.com/doc/tutorial/
*********************************************************
变量
.
数据类型
.
|
在上一节给出的
”Hello World”
程序的价值是很值得怀疑的。我们不得不为了在屏幕上输出一个简单的句子而写几行代码,还要编译它们,然后再执行得到的程序。它确实比我们自己打那个输出的句子要快很多。但是,编程不是只限于在屏幕上输出简单的文本。为了走的更远一些,并能写出可以完成实际任务来帮助我们工作的程序,我们需要介绍变量的概念。
让我们来设想下面这个场景:你先在大脑中记住
5
这个数字,同时你再记住数字
2
。你在记忆中已经保存有
2
个不同的值。现在,在第一个数字上加
1
,你应该在记忆里保持数字
6(5+1)
和
2
。我们再把这两个数相减,得到了
4
这个结果。
你刚刚在脑海中作的整个过程和计算机能够对两个变量的操作很相似。同样的过程可以用下面这组
C++
指令来表示:
a = 5;
b = 2;
a = a + 1;
result = a - b
;
|
显然,这是一个非常简单的例子因为我们用了
2
个小整数值,但是想一下你的计算机可以同时存储几百万个想这样的数字,并操作它们进行复杂的数学运算。
因此,我们可以定义变量为保存特定值的一块内存。
任何一个变量都需要一个标识符用来和其他变量进行区分,例如,在前面的代码里
a
,
b
和
result
就是变量标识符。我们可以给变量起任何我们想要的名字,只要我们起的名字是有效的标识符。
标识符
一个有效的标识符是由一个或几个字母,数字或下划线
(_)
组成的。在标识符中不允许出现空格和标点符号,只有字母,数字和下划线是允许的。并且,变量标识符通常以字母开头。虽然它们也可以用下划线
(_)
开始,但这经常是留给编译器特殊关键字或外部标识符。在任何情况下它们都不能以一个数字开始。
另一条在你选择自己的标识符时必须遵守的规则是,它们不可以和
C++
语言的任何关键字或你的编译器的特殊字相同,因为这样会使它们产生混乱。一些公共的保留关键字是:
asm, auto, bool, break, case, catch, char, class, const, const_cast, continue, default, delete, do, double, dynamic_cast, else, enum, explicit, export, extern, false, float, for, friend, goto, if, inline, int, long, mutable, namespace, new, operator, private, protected, public, register, reinterpret_cast, return, short, signed, sizeof, static, static_cast, struct, switch, template, this, throw, true, try, typedef, typeid, typename, union, unsigned, using, virtual, void, volatile, wchar_t, while
另外,一些操作符的替代表示也不能被定义为标识符,因为它们在某些情况下是保留字,他们有:
and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq
你的编译器可能还有其他的特殊保留关键字。
特别注意
:
C++
语言是大小写敏感的语言。这意味着一个用大写字母写的标识符和另一个名字相同,但是用小写字母写的标识符是不同的。因此,变量
RESULT
和变量
result
或变量
Result
是不同的。这是三个不同的变量标识符。
基本数据类型
在编程的时候,我们把变量保存在我们计算机的内存里,但是计算机需要知道我们想要在他们里面存些什么,因为保存一个简单的数字或一个单个的字母或一个巨大的数字所要占用的内存是不会相同的,他们也不会被按相同的方式理解。
我们计算机中的内存是按字节
(byte)
组织的。一个字节是我们在
C++
中可以管理的最小的内存单位。一个字节可以存储相对来说比较少的数据:一个单个的字母或一个小整数
(
通常是一个在
0-255
之间的整数
)
。另外,计算机可以处理由几个字节组成的更复杂的数据类型,如长数字或非整型数字。
下面是一个
C++
中存在的基本数据类型的列表,附带有他们的表数范围:
基本数据类型:
名字
|
描述
|
大小
*
|
表数范围
*
|
char
|
字母或小整数。
|
1byte
|
有符号:
-128 to 127 无符号: 0 to 255 |
int
|
整数。
|
1word
|
有符号:
-2147483648 to 2147483647 无符号: 0 to 4294967295 |
short int
short |
短整数。
|
2bytes
|
有符号:
-32768 to 32767 无符号: 0 to 65535 |
long int
long |
常整数。
|
4bytes
|
有符号
-2147483648 to 2147483647 无符号: 0 to 4294967295 |
bool
|
布尔值。它只能取
true(
真
)
或
false(
假
)
里的一个。
|
1byte
|
true or false
|
float
|
浮点数。
|
4bytes
|
3.4e +/- 38 (7
位
)
|
double
|
双精度浮点数。
|
8bytes
|
1.7e +/- 308 (15
位
)
|
long double
|
长双精度浮点数。
|
8bytes
|
1.7e +/- 308 (15
位
)
|
wchar_t
|
宽字符型。
|
2bytes
|
1
个宽字母。
|
*
列“大小”和“表数范围”里的值取决于程序编译和运行的系统的体系结构。这里的值是在
32
位
(bit)
系统里的最通常的值。
short
和
long
与
short int
和
long int
的含义完全相同。
定义变量
为了在
C++
中使用一个变量,我们必须声明我们想要他是什么数据类型的。声明一个新变量的语法是在数据类型说明符
(
如
int, bool, float…)
后面跟一个有效的变量标识符。例如:
int a;
float mynumber;
|
这是两个有效的变量声明。第一个声明了一个用标识符
a
标识的整形变量。第二个声明了一个用标识符
mynumber
标识的浮点型变量。一旦被声明了,变量
a
和
mynumber
就能够在程序中它们的有效范围里使用。
如果你想声明多个同一类型的变量,你可以在一条语句里声明他们全部,但要用逗号
(,)
把他们隔开。例如:
int a, b, c;
|
这里定义了三个变量
(a, b
和
c)
,他们都是
int
型的,并和下面方式的声明意义相同:
int a;
int b;
int c;
|
整型数据类型
char, short, long
和
int
即可以是有符号的也可以是无符号的,这取决于想要表数的范围
。有符号类型既可以表示正数又可以表示负数,而无符号类型只能表示正数
(
和零
)
。可以在类型名前加上说明符
signed
或说明符
unsigned
加以声明。例如:
unsigned short int NumberOfSisters;
signed int MyAccountBalance;
|
缺省情况下,如果我们没有说明
signed
或
unsigned
大部分编译器设置将假设类型是有符号的,因此我们可以用下面的写法来替换第二个声明:
int MyAccountBalance;
|
他们拥有完全相同的意义
(
加或不加关键字
signed)
这条通常规则的一个特例是
char
类型,它是单独存在的并被认为是与
signed char
和
unsigned char
不同的基本数据类型。如果你想在一个字母大小的变量里存放数量值的话你需要使用
signed
或
unsigned
。
short
和
long
可以被作为类型说明符而单独使用。这种情况下,它们指的是它们各自的整型基本类型
:short
等价于
short int
,
long
等价于
long int
。下面的两个变量定义是等价的:
short Year;
short int Year;
|
最后,
signed
和
unsigned
也可以被用作独立的类型说明符,和
signed int
和
unsigned int
的意义相同。下面两个定义是等价的:
unsigned NextYear;
unsigned int NextYear;
|
为了看变量声明在一个程序中是如何工作的,我们将看下面这段模仿你在这节开始时的记忆例子的
C++
代码:
// operating with variables
#include <iostream>
using namespace std;
int main ()
{
// declaring variables:
int a, b;
int result;
// process:
a = 5;
b = 2;
a = a + 1;
result = a - b;
// print out the result:
cout << result;
// terminate the program:
return 0;
}
|
4
|
如果你觉得除了变量定义之外有一些东西有点陌生,不要担心,你将会在后面的章节里看到详细的解释。
变量的作用域
我们打算在一个程序里使用的变量,都必须在其被使用前的代码中被用它的类型说明符声明,就像我们在上面的代码里做的那样。我们在
main
函数的函数体的刚开始声明
a
, b
和
result
为
int
类型。
一个变量的作用域可以是全局的
(global)
,也可以是局部的
(local)
。一个全局变量
(global variable)
是在源代码的主体里,所有函数之外定义的;而一个局部变量
(local variable)
是定义在一个函数的函数体或块的体里定义的。
全局变量在它声明之后的代码的任何地方应用,甚至在函数里。
局部变量的作用域被限制在它被声明时所在的被花括号
( {} )
封闭的块里。例如,如果它们在一个函数的函数体的开始部分被声明
(
如在函数
main
中
)
它们的作用域为从它们的声明点到那个函数的结束。在上面的例子中,这意味着:如果除了
main
之外还有另一个函数存在的话,在
main
中声明的局部变量在其他函数里将无法访问,反之亦然。
变量初始化
在声明一个正常的局部变量的时候,它的缺省值是不确定的。但是你可能想让一个变量在被声明的同时就保存一个确定的值。为了做到这些,你可以初始化一个变量。在
C++
中有两种方法做这件事:
第一种方法,和
C
语言相似,是在变量的后面跟一个等号,等号的后面是变量将被初始化的值:
type identifier = initial_value ;
例如,如果我们想声明一个
int
型变量
a
,并在它被声明的同时把它初始化为值
0
,我们可以写成:
int a = 0;
|
另一种初始化的方法是“构造初始化”,是把要初始化的值用小括号
( () )
包起来:
type identifier (initial_value) ;
例如
:
int a (0);
|
在
C++
中这两种变量初始化的方法都是正确的,它们也是等价的。
// initialization of variables
#include <iostream>
using namespace std;
int main ()
{
int a=5;
// initial value = 5
int b(2);
// initial value = 2
int result;
// initial value undetermined
a = a + 3;
result = a - b;
cout << result;
return 0;
}
|
6
|
字符串
(strings)
入门
存储非数值量又比单个字母长的变量就是字符串。
C++
语言库通过标准
string
类对字符串提供支持。这不是一个基本的类型,但是在它的大部分基本用法里它的行为和基本类型是相似的。
与基本数据类型的第一不同是,为了声明并使用一个这个类型的对象
(object)(
变量
)
,我们需要在我们的源文件里包含另一个头文件:
<string>
并使用
std
名空间
(
在我们先前所用的程序中我们已经有了,感谢
using namespace
那条语句
)
。
// my first string
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string mystring =
"This is a string"
;
cout << mystring;
return 0;
}
|
This is a string
|
就像你在上面的例子中看到的,字符串就像数值类型变量类型可以被初始化为任意有效的数值值一样,可以被初始化为任意串文字。两种初始化方式对字符串都有效:
string mystring =
"This is a string"
;
string mystring (
"This is a string"
);
|
字符串已可以完成基本数据类型可以完成的其他操作,例如被声明但不被初始值,并且在执行的过程中被赋值:
// my first string
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string mystring;
mystring =
"This is the initial string content"
;
cout << mystring << endl;
mystring =
"This is a different string content"
;
cout << mystring << endl;
return 0;
}
|
This is the initial string content
This is a different string content
|