• 教程
  • 变量。数据类型。

变量。数据类型。

前一节中展示的“Hello World”程序的用处非常值得怀疑。 我们必须编写几行代码,编译它们,然后执行生成的程序,才能在屏幕上获得一个简单的句子作为结果。 肯定我们自己输入输出语句会更快。 但是,编程不仅仅限于在屏幕上打印简单的文本。 为了更进一步,并且能够编写执行真正为我们节省工作量的有用任务的程序,我们需要引入变量的概念。

让我们假设我要求你在你的心理记忆中保留数字 5,然后我要求你同时记住数字 2。 你刚刚在你的记忆中存储了两个不同的值。 现在,如果我要求你给第一个数字加 1,你应该在你的记忆中保留数字 6(即 5+1)和 2。 这些值我们现在可以 - 例如 - 相减并得到 4 作为结果。

你刚刚用你的心理记忆所做的整个过程类似于计算机可以用两个变量做的事情。 相同的过程可以用 C++ 用以下指令集表达

1
2
3
4
a = 5;
b = 2;
a = a + 1;
result = a - b;

显然,这是一个非常简单的例子,因为我们只使用了两个小的整数值,但请考虑你的计算机可以同时存储数百万个像这样的数字,并对它们进行复杂的数学运算。

因此,我们可以将变量定义为存储确定值的内存部分。

每个变量都需要一个标识符来区分它与其他变量。 例如,在前面的代码中,变量标识符abresult,但我们可以随意为变量命名,只要它们是有效的标识符。

标识符

有效标识符是由一个或多个字母、数字或下划线字符 (_) 组成的序列。 空格或标点符号或符号都不能成为标识符的一部分。 只有字母、数字和单个下划线字符是有效的。 此外,变量标识符总是必须以字母开头。 它们也可以以下划线字符 (_) 开头,但在某些情况下,这些字符可能被保留用于编译器特定的关键字或外部标识符,以及包含两个连续下划线字符的标识符。 在任何情况下,它们都不能以数字开头。

在创建自己的标识符时,您必须考虑的另一个规则是,它们不能与 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 变量不同。 这些是三个不同的变量标识符。

基本数据类型

编程时,我们将变量存储在计算机的内存中,但计算机必须知道我们想要在其中存储什么类型的数据,因为它存储一个简单的数字与存储一个字母或一个大数字所占用的内存量不同,并且它们的解释方式也不同。

我们计算机中的内存以字节为单位组织。 一个字节是我们可以用 C++ 管理的最小内存量。 一个字节可以存储相对少量的数据:一个字符或一个小的整数(通常是 0 到 255 之间的整数)。 此外,计算机可以处理更复杂的数据类型,这些数据类型来自对几个字节进行分组,例如长数字或非整数数字。

接下来是 C++ 中基本数据类型的摘要,以及每种数据类型可以表示的值的范围

姓名描述大小*范围*
char 字符或小整数。 1字节 signed: -128 到 127
unsigned: 0 到 255
short int (short) 短整数。 2字节 signed: -32768 到 32767
unsigned: 0 到 65535
int 整数。 4字节 signed: -2147483648 到 2147483647
unsigned: 0 到 4294967295
long int (long) 长整数。 4字节 signed: -2147483648 到 2147483647
unsigned: 0 到 4294967295
bool 布尔值。 它可以取两个值之一:true 或 false。 1字节 truefalse
float 浮点数。 4字节 +/- 3.4e +/- 38 (~7 位数字)
double 双精度浮点数。 8字节 +/- 1.7e +/- 308 (~15 位数字)
long double 长双精度浮点数。 8字节 +/- 1.7e +/- 308 (~15 位数字)
wchar_t 宽字符。 2 4 字节 1 个宽字符

* 列大小范围的值取决于程序编译的系统。 上面显示的值是在大多数 32 位系统上找到的值。 但对于其他系统,一般规范是 int 具有系统架构建议的自然大小(一个“字”),并且四种整数类型 charshortintlong 中的每一种都必须至少与其前一个一样大,其中 char 始终是一个字节大小。 同样适用于浮点类型 floatdoublelong double,其中每一种都必须提供至少与其前一种一样多的精度。

变量的声明

为了在 C++ 中使用变量,我们必须首先声明它,指定我们希望它成为哪种数据类型。 声明新变量的语法是编写所需数据类型的说明符(如 int、bool、float...),后跟一个有效的变量标识符。 例如

1
2
int a;
float mynumber;

这是两个有效的变量声明。 第一个声明一个类型为 int 的变量,其标识符为 a。 第二个声明一个类型为 float 的变量,其标识符为 mynumber。 声明后,变量 amynumber 可以在程序中的其余作用域内使用。

如果您要声明多个相同类型的变量,您可以通过用逗号分隔它们的标识符,在单个语句中声明所有变量。 例如

1
int a, b, c;

这声明了三个变量(abc),它们都是类型 int,并且具有与以下代码完全相同的含义

1
2
3
int a;
int b;
int c;

整数数据类型 charshortlongint 可以是有符号的或无符号的,具体取决于需要表示的数字范围。 有符号类型可以表示正值和负值,而无符号类型只能表示正值(和零)。 这可以通过在类型名称之前使用说明符 signed 或说明符 unsigned 来指定。 例如

1
2
unsigned short int NumberOfSisters;
signed int MyAccountBalance;

默认情况下,如果我们不指定 signedunsigned,大多数编译器设置将假定该类型为有符号类型,因此我们可以编写以下代码来代替上面的第二个声明

1
int MyAccountBalance;

具有完全相同的含义(有或没有关键字 signed

此一般规则的一个例外是 char 类型,它本身存在,并且被认为是与 signed charunsigned char 不同的基本数据类型,但用于存储字符。 如果您打算在 char 大小的变量中存储数值,则应使用 signedunsigned

shortlong 可以单独用作类型说明符。 在这种情况下,它们指的是它们各自的整数基本类型:short 等同于 short intlong 等同于 long int。 以下两个变量声明是等效的

1
2
short Year;
short int Year;

最后,signedunsigned 也可以用作独立的类型说明符,含义与 signed intunsigned int 分别相同。 以下两个声明是等效的

1
2
unsigned NextYear;
unsigned int NextYear;

要查看变量声明在程序中的实际效果,我们将看到本节开头提出的关于您的心理记忆的示例的 C++ 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 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 的主体开头声明 abresult 是类型 int 时所做的那样。

变量可以是全局作用域或局部作用域。 全局变量是在源代码的主体中声明的变量,位于所有函数之外,而局部变量是在函数或块的主体中声明的变量。


全局变量可以在代码中的任何位置引用,甚至在函数内部,只要它在声明之后。

局部变量的作用域仅限于声明它们的括号 ({}) 括起来的块。 例如,如果在函数主体(如函数 main)的开头声明它们,则它们的作用域在声明点和该函数的结尾之间。 在上面的示例中,这意味着如果除了 main 之外还存在另一个函数,则无法从其他函数访问在 main 中声明的局部变量,反之亦然。

变量的初始化

声明常规局部变量时,其值默认是不确定的。 但是您可能希望变量在声明的同时存储一个具体的值。 为了做到这一点,你可以初始化变量。 在 C++ 中有两种方法可以做到这一点

第一个,被称为c 式初始化,是通过附加一个等号,后跟将变量初始化的值来完成的

type identifier = initial_value ;
例如,如果我们要声明一个 int 变量,称为 a,并在声明时用值 0 初始化,我们可以写

1
int a = 0;

另一种初始化变量的方式,被称为构造函数初始化,是通过将初始值括在括号 (()) 之间来完成的

type identifier (initial_value) ;
例如:

1
int a (0);

这两种初始化变量的方式在 C++ 中都是有效且等效的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 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

字符串简介

可以存储比单个字符更长的非数值的变量称为字符串。

C++ 语言库通过标准 string 类提供对字符串的支持。 这不是基本类型,但在其最基本用法中,它的行为方式与基本类型类似。

与基本数据类型的第一个区别是,为了声明和使用此类型的对象(变量),我们需要在我们的源代码中包含一个额外的头文件:<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

正如您可能在前面的示例中看到的那样,字符串可以用任何有效的字符串文字初始化,就像数值类型的变量可以被初始化为任何有效的数值文字一样。 这两种初始化格式对于字符串都是有效的

1
2
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

有关 C++ 字符串的更多详细信息,您可以查看 字符串类参考
Index
目录