C++ 变量与类型

C++C++Beginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将学习 C++ 中的变量和类型。你将学习如何定义变量,以及如何使用不同类型的变量。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL cpp(("`C++`")) -.-> cpp/BasicsGroup(["`Basics`"]) cpp(("`C++`")) -.-> cpp/IOandFileHandlingGroup(["`I/O and File Handling`"]) cpp(("`C++`")) -.-> cpp/SyntaxandStyleGroup(["`Syntax and Style`"]) cpp/BasicsGroup -.-> cpp/variables("`Variables`") cpp/BasicsGroup -.-> cpp/data_types("`Data Types`") cpp/BasicsGroup -.-> cpp/operators("`Operators`") cpp/BasicsGroup -.-> cpp/booleans("`Booleans`") cpp/BasicsGroup -.-> cpp/strings("`Strings`") cpp/IOandFileHandlingGroup -.-> cpp/output("`Output`") cpp/SyntaxandStyleGroup -.-> cpp/code_formatting("`Code Formatting`") subgraph Lab Skills cpp/variables -.-> lab-178540{{"`C++ 变量与类型`"}} cpp/data_types -.-> lab-178540{{"`C++ 变量与类型`"}} cpp/operators -.-> lab-178540{{"`C++ 变量与类型`"}} cpp/booleans -.-> lab-178540{{"`C++ 变量与类型`"}} cpp/strings -.-> lab-178540{{"`C++ 变量与类型`"}} cpp/output -.-> lab-178540{{"`C++ 变量与类型`"}} cpp/code_formatting -.-> lab-178540{{"`C++ 变量与类型`"}} end

内容预览

计算机程序操作(或处理)数据。变量用于存储一段数据以便处理。之所以称为变量,是因为你可以更改存储的值。

  • 变量
  • 标识符
  • 变量声明
  • 常量
  • 表达式
  • 赋值
  • 基本类型
  • 基本类型和字符串的字面量

变量

变量是一个命名的存储位置,用于存储特定数据类型。换句话说,一个变量具有名称类型并存储一个

  • 变量有一个名称(或标识符),例如 radiusareaageheight。名称用于唯一标识每个变量,以便为变量赋值并检索存储的值。
  • 变量有一个类型,例如 intdouble
  • 变量可以存储该特定类型。变量与类型相关联,并且只能存储该特定类型的值。
  • 类型决定了数据的大小和布局、其值的范围以及可以应用的操作集。

下图展示了两类变量:intdoubleint 变量存储整数(整数),而 double 变量存储实数。

image desc

标识符

标识符用于为变量(或任何其他实体,如函数或类)命名。C++ 对标识符有以下规则

  • 标识符是一个字符序列,包含大写和小写字母 (a-z, A-Z)、数字 (0-9) 和下划线 "_"
  • 不允许使用空白字符(空格、制表符、换行符)和其他特殊字符(如 +-*/'@' 等)。
  • 标识符必须以字母或下划线开头,不能以数字开头。以下划线开头的标识符通常保留给系统使用。
  • 标识符不能是保留关键字或保留字面量(例如 intdoubleifelsefor)。
  • 标识符区分大小写。rose 不是 Rose,也不是 ROSE

变量命名规范

变量名是一个名词,或由多个单词组成的名词短语。第一个单词小写,其余单词首字母大写,单词之间没有空格。例如,thefontSizeroomNumberxMaxthisIsAVeryLongVariableName,这种命名方式称为驼峰命名法

建议

  1. 选择一个自描述且能准确反映变量含义的名称非常重要,例如 numberOfStudentsnumStudents
  2. 不要使用无意义的名称,如 abcdijki1j99。避免使用单字母名称,除非它们是常见的名称,如用于坐标的 xyz,或用于索引的 i
  3. 使用长名称(例如 30 个字符)是完全没问题的,以确保名称准确反映其含义。
  4. 谨慎使用单数和复数名词来区分单数和复数变量。例如,使用变量 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 值

赋值 (=)

赋值语句

  1. 将右侧(RHS)的字面值赋给左侧(LHS)的变量;或
  2. 计算右侧(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 布尔值,truefalse 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
image desc

typedef 语句

多次输入 unsigned int 可能会让人感到厌烦。typedef 语句可以为现有类型创建新名称。例如,你可以为 unsigned int 创建一个名为 uint 的新类型,如下所示。你应该将 typedef 放在 #include 之后。谨慎使用 typedef,因为它会使程序难以阅读和理解。

typedef unsigned int uint;

许多 C/C++ 编译器定义了一个名为 size_t 的类型,它是 unsigned inttypedef

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,其中 eE 表示以 10 为底的指数。你可以在小数部分或指数前加上加号(+)或减号(-)。指数必须是整数。

对于 float 字面量,你必须使用后缀 'f''F',例如 -1.2345F。例如:

float average = 55.66;      // 错误!右侧是 double。需要后缀 'f' 表示 float。
float average = 55.66f;

对于 long double,使用后缀 'L'(或 'l')。

布尔字面量

只有两个布尔字面量,即 truefalse。例如:

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
image desc

总结

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

您可能感兴趣的其他 C++ 教程