介绍
在本实验中,你将学习 C++ 中的变量和类型。你将学习如何定义变量,以及如何使用不同类型的变量。
内容预览
计算机程序操作(或处理)数据。变量用于存储一段数据以便处理。之所以称为变量,是因为你可以更改存储的值。
- 变量
- 标识符
- 变量声明
- 常量
- 表达式
- 赋值
- 基本类型
- 基本类型和字符串的字面量
变量
变量是一个命名的存储位置,用于存储特定数据类型的值。换句话说,一个变量具有名称、类型并存储一个值。
- 变量有一个名称(或标识符),例如
radius、area、age、height。名称用于唯一标识每个变量,以便为变量赋值并检索存储的值。 - 变量有一个类型,例如
int或double。 - 变量可以存储该特定类型的值。变量与类型相关联,并且只能存储该特定类型的值。
- 类型决定了数据的大小和布局、其值的范围以及可以应用的操作集。
下图展示了两类变量:int 和 double。int 变量存储整数(整数),而 double 变量存储实数。

标识符
标识符用于为变量(或任何其他实体,如函数或类)命名。C++ 对标识符有以下规则:
- 标识符是一个字符序列,包含大写和小写字母
(a-z, A-Z)、数字(0-9)和下划线"_"。 - 不允许使用空白字符(空格、制表符、换行符)和其他特殊字符(如
+、-、*、/、'@'等)。 - 标识符必须以字母或下划线开头,不能以数字开头。以下划线开头的标识符通常保留给系统使用。
- 标识符不能是保留关键字或保留字面量(例如
int、double、if、else、for)。 - 标识符区分大小写。
rose不是Rose,也不是ROSE。
变量命名规范
变量名是一个名词,或由多个单词组成的名词短语。第一个单词小写,其余单词首字母大写,单词之间没有空格。例如,thefontSize、roomNumber、xMax 和 thisIsAVeryLongVariableName,这种命名方式称为驼峰命名法。
建议
- 选择一个自描述且能准确反映变量含义的名称非常重要,例如
numberOfStudents或numStudents。 - 不要使用无意义的名称,如
a、b、c、d、i、j、k、i1、j99。避免使用单字母名称,除非它们是常见的名称,如用于坐标的x、y、z,或用于索引的i。 - 使用长名称(例如 30 个字符)是完全没问题的,以确保名称准确反映其含义。
- 谨慎使用单数和复数名词来区分单数和复数变量。例如,使用变量
row来引用单个行号,使用rows来引用多行。
变量声明
在使用变量之前,你需要先声明其名称和类型,语法如下:
| 语法 | 示例 |
|---|---|
| 声明一个指定类型的变量 | int option; |
| 声明多个相同类型的变量,用逗号分隔 | double sum, difference, product, quotient; |
| 声明一个变量并为其赋初始值 | int magicNumber = 88; |
| 声明多个变量并为其赋初始值 | double sum = 0.0, product = 1.0; |
例如
int mark1; // 声明一个名为 mark1 的 int 变量
mark1 = 76; // 使用 mark1
int mark2; // 声明 int 变量 mark2
mark2 = mark1 + 10; // 使用 mark2 和 mark1
double average; // 声明 double 变量 average
average = (mark1 + mark2) / 2.0; // 使用 average、mark1 和 mark2
int mark1; // 错误:重复声明
mark2 = "Hello"; // 错误:赋值类型不匹配
int number; // 声明但未初始化
cout << number << endl; // 使用未初始化的变量,无警告/错误,但结果不可预期。
注意:
- 在 C++ 中,你需要在使用变量之前声明其名称。
- C++ 是一种“强类型”语言。变量具有类型。一旦变量的类型被声明,它只能存储属于该特定类型的值。
- 每个变量只能声明一次。
- 在 C++ 中,你可以在程序中的任何位置声明变量,只要在使用之前声明即可。
- 变量的类型在程序中不能更改。
- 刚声明但未初始化的变量包含垃圾值。C/C++ 不会在使用未初始化的变量时发出任何警告/错误,这可能导致一些不可预期的结果。
常量 (const)
常量是不可修改的变量,使用关键字 const 声明。它们的值在程序执行期间不能被更改。此外,const 必须在声明时初始化。例如:
const double PI = 3.1415926; // 需要初始化
常量命名规范:使用大写字母,并用下划线连接。例如,MIN_VALUE。
表达式
表达式是运算符(如 '+'、'-'、'*'、'/')和操作数(变量或字面值)的组合,可以求值为某个类型的单个值。例如:
1 + 2 * 3 // 结果为 int 7
int sum, number;
sum + number // 求值为一个 int 值
double principal, interestRate;
principal * (1 + interestRate) // 求值为一个 double 值
赋值 (=)
赋值语句:
- 将右侧(RHS)的字面值赋给左侧(LHS)的变量;或
- 计算右侧(RHS)的表达式,并将结果值赋给左侧(LHS)的变量。
右侧(RHS)必须是一个值;左侧(LHS)必须是一个变量(或内存地址)。
赋值语句的语法如下:
| 语法 | 示例 |
|---|---|
| 将右侧(RHS)的字面值赋给左侧(LHS)的变量 | number = 88; |
| 计算右侧(RHS)的表达式并将结果赋给左侧(LHS)的变量 | sum = sum + number; |
赋值语句应这样理解:首先计算右侧(RHS)的表达式,生成一个结果值(称为右值或右值)。然后将右值赋给左侧(LHS)的变量(或左值,即可以存储右值的位置)。
基本类型
下表展示了基本类型的典型大小、最小值和最大值。再次注意,这些大小依赖于具体实现。
| 类别 | 类型 | 描述 | 字节数(典型) | 最小值(典型) | 最大值(典型) |
|---|---|---|---|---|---|
| 整数 | int(或 signed int) | 有符号整数(至少 16 位) | 4 (2) | -2147483648 | 2147483647 |
| 整数 | unsigned int | 无符号整数(至少 16 位) | 4 (2) | 0 | 4294967295 |
| 整数 | char | 字符(可能是有符号或无符号,取决于实现) | 1 | ||
| 整数 | signed char | 字符或有符号小整数(保证有符号) | 1 | -128 | 127 |
| 整数 | unsigned char | 字符或无符号小整数(保证无符号) | 1 | 0 | 255 |
| 整数 | signed short | 短有符号整数(至少 16 位) | 2 | -32768 | 32767 |
| 整数 | unsigned short | 无符号短整数(至少 16 位) | 2 | 0 | 65535 |
| 整数 | long | 长有符号整数(至少 32 位) | 4 (8) | -2147483648 | 2147483647 |
| 整数 | unsigned long | 无符号长整数(至少 32 位) | 4 (8) | 0 | 同上 |
| 整数 | long long | 超长有符号整数(至少 64 位) | 8 | -2e^63 | 2e^63-1 |
| 整数 | unsigned long long | 无符号超长整数(至少 64 位) | 8 | 0 | 2e^64-1 |
| 实数 | float | 浮点数,≈7 位有效数字 | 4 | 3.4e^38 | 3.4e^(-38) |
| 实数 | double | 双精度浮点数,≈15 位有效数字 | 8 | 1.7e^308 | 1.7e^(-308) |
| 实数 | long double | 长双精度浮点数,≈19 位有效数字 | 12 (8) | ||
| 布尔值 | bool | 布尔值,true 或 false |
1 | false (0) | true (1 或非零) |
| 宽字符 | wchar_t, char16_t, char32_t | 宽字符(双字节) | 2 (4) |
sizeof 运算符
C/C++ 提供了一个一元运算符 sizeof,用于获取操作数的大小(以字节为单位)。以下程序使用 sizeof 运算符打印基本类型的大小(将以下代码保存到 /home/labex/Code 中的 test.cpp 文件中)。
/*
* 打印基本类型的大小。
*/
#include <iostream>
using namespace std;
int main() {
cout << "sizeof(char) is " << sizeof(char) << " bytes " << endl;
cout << "sizeof(short) is " << sizeof(short) << " bytes " << endl;
cout << "sizeof(int) is " << sizeof(int) << " bytes " << endl;
cout << "sizeof(long) is " << sizeof(long) << " bytes " << endl;
cout << "sizeof(long long) is " << sizeof(long long) << " bytes " << endl;
cout << "sizeof(float) is " << sizeof(float) << " bytes " << endl;
cout << "sizeof(double) is " << sizeof(double) << " bytes " << endl;
cout << "sizeof(long double) is " << sizeof(long double) << " bytes " << endl;
cout << "sizeof(bool) is " << sizeof(bool) << " bytes " << endl;
return 0;
}
输出:
sizeof(char) is 1 bytes
sizeof(short) is 2 bytes
sizeof(int) is 4 bytes
sizeof(long) is 4 bytes
sizeof(long long) is 8 bytes
sizeof(float) is 4 bytes
sizeof(double) is 8 bytes
sizeof(long double) is 12 bytes
sizeof(bool) is 1 bytes

typedef 语句
多次输入 unsigned int 可能会让人感到厌烦。typedef 语句可以为现有类型创建新名称。例如,你可以为 unsigned int 创建一个名为 uint 的新类型,如下所示。你应该将 typedef 放在 #include 之后。谨慎使用 typedef,因为它会使程序难以阅读和理解。
typedef unsigned int uint;
许多 C/C++ 编译器定义了一个名为 size_t 的类型,它是 unsigned int 的 typedef。
typedef unsigned int size_t;
基本类型和字符串的字面量
整数字面量
默认情况下,像 123 和 -456 这样的整数被视为 int。例如:
int number = -123;
int sum = 4567;
除了默认的十进制整数外,你可以使用前缀 '0x' 表示十六进制值,前缀 '0b' 表示二进制值(在某些编译器中),例如:
int number1 = 1234; // 十进制
int number2 = 01234; // 八进制 1234,十进制 2322
int number3 = 0x1abc; // 十六进制 1ABC,十进制 15274
int number4 = 0b10001001; // 二进制(在某些编译器中可能不支持)
long 字面量通过后缀 'L' 或 'l' 标识(避免使用小写 'l',因为它可能与数字 1 混淆)。long long int 通过后缀 'LL' 标识。你还可以使用后缀 'U' 表示 unsigned int,'UL' 表示 unsigned long,'ULL' 表示 unsigned long long int。例如:
long number = 12345678L; // 后缀 'L' 表示 long
long sum = 123; // int 123 自动转换为 long 123L
long long bigNumber = 987654321LL; // 需要后缀 'LL' 表示 long long int
short 字面量不需要后缀。但你只能使用允许范围内的整数值。例如:
short midSizeNumber = -12345;
浮点数字面量
默认情况下,带有小数点的数字(如 55.66 和 -33.44)被视为 double。你也可以用科学计数法表示它们,例如 1.2e3、-5.5E-6,其中 e 或 E 表示以 10 为底的指数。你可以在小数部分或指数前加上加号(+)或减号(-)。指数必须是整数。
对于 float 字面量,你必须使用后缀 'f' 或 'F',例如 -1.2345F。例如:
float average = 55.66; // 错误!右侧是 double。需要后缀 'f' 表示 float。
float average = 55.66f;
对于 long double,使用后缀 'L'(或 'l')。
布尔字面量
只有两个布尔字面量,即 true 和 false。例如:
bool done = true;
bool gameOver = false;
int i;
if (i == 9) { // 返回 true 或 false
......
}
字符字面量
可打印的 char 字面量通过用一对单引号括起来的字符表示,例如 'z'、'$' 和 '9'。在 C++ 中,字符使用 8 位 ASCII 码表示,并且在算术运算中可以视为 8 位有符号整数。换句话说,char 和 8 位有符号整数是可以互换的。你还可以将 [-128, 127] 范围内的整数赋值给 char 变量;将 [0, 255] 范围内的整数赋值给 unsigned char。例如:
char letter = 'a'; // 等同于 97
char anotherLetter = 98; // 等同于字母 'b'
cout << letter << endl; // 打印 'a'
cout << anotherLetter << endl; // 打印 'b' 而不是数字
anotherLetter += 2; // 100 或 'd'
cout << anotherLetter << endl; // 打印 'd'
cout << (int)anotherLetter << endl; // 打印 100
字符串字面量
String 字面量由零个或多个字符组成,并用一对双引号括起来,例如 "Hello, world!"、"The sum is "、""。例如:
String directionMsg = "Turn Right";
String greetingMsg = "Hello";
String statusMsg = ""; // 空字符串
示例(字面量)
/* 测试基本类型 */
#include <iostream>
using namespace std;
int main() {
char gender = 'm'; // char 用单引号括起来
bool isMarried = true; // true(非零)或 false(0)
unsigned short numChildren = 8; // [0, 255]
short yearOfBirth = 1945; // [-32767, 32768]
unsigned int salary = 88000; // [0, 4294967295]
double weight = 88.88; // 带有小数部分
float gpa = 3.88f; // 需要后缀 'f' 表示 float
// "cout <<" 可以用于打印任何类型的值
cout << "Gender is " << gender << endl;
cout << "Is married is " << isMarried << endl;
cout << "Number of children is " << numChildren << endl;
cout << "Year of birth is " << yearOfBirth << endl;
cout << "Salary is " << salary << endl;
cout << "Weight is " << weight << endl;
cout << "GPA is " << gpa << endl;
return 0;
}
输出:
Gender is m
Is married is 1 // true
Number of children is 8
Year of birth is 1945
Salary is 88000
Weight is 88.88
GPA is 3.88

总结
在这一部分中,我们介绍了几种基本类型。你应该了解如何表示变量以及如何对其进行操作。请记住每种类型在内存中的大小及其取值范围。



