介绍
在本实验中,你将学习 C++ 中的变量和类型。你将学习如何定义变量,以及如何使用不同类型的变量。
在本实验中,你将学习 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
。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; // 使用未初始化的变量,无警告/错误,但结果不可预期。
注意:
常量是不可修改的变量,使用关键字 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)的变量 | 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
在这一部分中,我们介绍了几种基本类型。你应该了解如何表示变量以及如何对其进行操作。请记住每种类型在内存中的大小及其取值范围。