前言

这一节我们将学习变量类型的相关知识,可能会涉及到一些C++的基本语法,如果你还有不明白的,请到C++基本语法这里温故一下

C++变量类型

在程序中,变量就是存储数据的容器。它们是程序可以操作的存储位置,每个变量都有一个名字和特定的数据类型。


变量类型的作用

  • 变量类型定义了:
    1. 占用的内存大小和布局:不同类型的数据需要不同大小的内存空间。
    2. 可以存储的值范围:例如,整数型不能存储小数,布尔型只能存储 truefalse
    3. 适用的运算:变量类型决定了哪些运算符可以对它们进行操作。

变量的命名规则

  1. 可以使用的字符:变量名可以由字母数字下划线(_)组成。
  2. 开头限制:变量名必须以字母下划线开头,不能以数字开头。
  3. 区分大小写:C++ 是区分大小写的语言,所以 Varvar 是两个不同的变量名。
  4. 建议使用有意义的名称:例如,用 age 表示年龄,比用 a 更直观。

变量的类型

C++ 中有多种变量类型,每种类型适用于不同种类的数据,例如:

  • 整数型存储整数。
  • 浮点型存储小数。
  • 字符型存储单个字符。
  • 布尔型存储逻辑值(truefalse)。

在后续章节中,我们将具体介绍这些变量类型的使用和特点!

Data Types Description

Data Types Description

类型 描述
bool 布尔类型,存储值 true 或 false,占用 1 个字节。
char 字符类型,用于存储 ASCII 字符,通常占用 1 个字节。
int 整数类型,通常用于存储普通整数,通常占用 4 个字节。
float 单精度浮点值,用于存储单精度浮点数。单精度是这样的格式,1 位符号,8 位指数,23 位小数,通常占用4个字节。
double 双精度浮点值,用于存储双精度浮点数。双精度是 1 位符号,11 位指数,52 位小数,通常占用 8 个字节。
void 表示类型的缺失。
wchar_t 宽字符类型,用于存储更大范围的字符,通常占用 2 个或 4 个字节。

C++中的变量类型

在 C++ 中,你可以定义各种类型的变量来存储不同种类的数据,以下是常见的几种类型:

整数类型 (Integer Types)

  • int:存储整数,通常占用 4 个字节。
  • short:存储较小的整数,通常占用 2 个字节。
  • long:存储较大的整数,通常占用 4 个字节。
  • long long:存储更大的整数,通常占用 8 个字节。

浮点类型 (Floating-Point Types)

  • float:存储单精度浮点数(带小数的数),通常占用 4 个字节。
  • double:存储双精度浮点数,精度比 float 高,通常占用 8 个字节。
  • long double:存储更高精度的浮点数,字节数依编译器和系统而不同。

字符类型 (Character Types)

  • char:存储一个字符,通常占用 1 个字节。
  • wchar_t:存储宽字符(用于表示更复杂的字符),占用 2 或 4 个字节。
  • char16_t:存储 16 位 Unicode 字符,占用 2 个字节。
  • char32_t:存储 32 位 Unicode 字符,占用 4 个字节。

布尔类型 (Boolean Type)

  • bool:存储布尔值,只能是 truefalse

枚举类型 (Enumeration Types)

  • enum:定义一组命名的整数常量,通常用来表示具有多个固定值的变量。

指针类型 (Pointer Types)

  • type*:存储指向某个类型变量的地址。

数组类型 (Array Types)

  • type[] 或 type[size]:存储多个相同类型的元素。

结构体类型 (Structure Types)

  • struct:存储多个不同类型的数据(可以是整数、字符等的组合)。

类类型 (Class Types)

  • class:存储具有属性和方法的自定义数据类型。

共用体类型 (Union Types)

  • union:存储多种类型的数据,但它们共享同一块内存空间,这意味着同一时刻只能存储其中一种类型。

注意:

  • C++ 标准规定了这些类型的最小大小,但实际占用的字节数可能会因为编译器或计算机架构的不同而有所差异。例如,int 在许多现代计算机上占用 4 字节,long 有时占用 8 字节。
  • 了解这些变量类型及其占用内存的特点有助于更好地管理程序中的数据和内存。

C++中的变量定义

在 C++ 中,变量定义是指告诉编译器在内存中为变量分配空间,并指定变量的数据类型。

变量定义的基本形式:

定义一个变量时,需要指定它的数据类型和变量的名称,格式如下:

1
type variable_list;

这里,type 是你要定义的变量的数据类型,例如 int(整数)、char(字符)等,variable_list 是你要定义的变量名,多个变量名用逗号分隔。

示例:

1
2
3
4
int i, j, k;   // 定义了三个整数变量 i, j, k
char c, ch; // 定义了两个字符变量 c 和 ch
float f, salary; // 定义了两个浮点数变量 f 和 salary
double d; // 定义了一个双精度浮点数变量 d

这行代码表示在内存中为 ijkcchfsalaryd 这些变量分配空间,并且每个变量的类型已经被明确指定。

变量初始化:

你可以在定义变量时,给它们一个初始值,这叫做初始化。格式如下:

1
type variable_name = value;

示例:

1
2
3
int d = 3, f = 5;    // 定义并初始化了两个整数变量 d 和 f
byte z = 22; // 定义并初始化了一个名为 z 的变量
char x = 'x'; // 定义了一个字符变量 x,其值为 'x'

这里,d 被初始化为 3,f 被初始化为 5,z 被初始化为 22,而 x 被初始化为字符 'x'

未初始化的变量:

如果你定义变量时没有给它们初始值,那么对于静态存储持续时间的变量,它们会被自动初始化为 0(空值);而对于局部变量,它们没有初始值,可能包含不确定的值,这样的变量会被称为“未定义值”。

总结:

  • 变量定义时,你要指定数据类型和变量名。
  • 可以在定义时给变量初始化一个值。
  • 如果没有初始化,静态变量会被自动初始化为 0,而其他变量没有初始值。

C++中的变量声明

在 C++ 中,变量声明告诉编译器你将在某个地方使用某个变量,但不需要在此时提供变量的具体内容。简单来说,声明只是告诉编译器“这个变量存在”。而变量定义则是真正分配内存空间并给变量赋值的过程。

变量声明:

声明一个变量时,使用extern关键字告诉编译器该变量在其他地方定义,不需要在当前代码中重复定义。声明的目的是为了让编译器知道该变量的类型和名称,以便在编译时不会出错。

语法:

1
extern type variable_name;

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;

// 变量声明
extern int a, b; // 声明了 a 和 b,表示它们将在其他地方定义
extern int c; // 声明了 c,表示它将在其他地方定义
extern float f; // 声明了 f,表示它将在其他地方定义

int main() {
// 变量定义和初始化
int a, b; // 定义变量 a 和 b
int c; // 定义变量 c
float f; // 定义变量 f

// 初始化变量
a = 10;
b = 20;
c = a + b;

cout << c << endl; // 输出 c 的值

f = 70.0 / 3.0;
cout << f << endl; // 输出 f 的值

return 0;
}

在这个例子中:

  • 我们在代码的开头声明了abcf这几个变量,告诉编译器它们将在其他地方定义。
  • 然后,在main函数中,我们实际上定义了这些变量并初始化了它们。

重要注意点:

  1. 声明:只是告诉编译器变量存在,不会分配内存。例如,extern int a; 声明了变量a,但它没有给a分配内存。
  2. 定义:才会为变量分配内存,并且可以给它一个初始值。例如,int a = 10; 会定义变量a,并给它分配内存和初始值。
  3. 多个声明,单次定义:你可以在多个地方声明同一个变量,但只应该在一个地方定义它。定义时会分配内存并赋值。

类似函数声明:

就像变量声明一样,函数也可以先声明再定义。你可以在程序的其他地方声明一个函数,而函数的定义可以放在程序的任何位置。

1
2
3
4
5
6
7
8
9
10
11
12
// 函数声明
int func();

int main() {
// 函数调用
int i = func();
}

// 函数定义
int func() {
return 0;
}

在这个例子中,函数func先声明,在main函数中调用它,实际的定义可以放在程序的任何地方。

总结:

  • 变量声明只是告诉编译器变量存在,并不分配内存。
  • 变量定义才会分配内存,并可以赋初值。
  • 函数声明告诉编译器函数存在,函数的实际实现可以在其他地方。

C++ 中的左值(Lvalues)和右值(Rvalues)

在 C++ 中,左值(Lvalue)和 右值(Rvalue)是两种不同类型的表达式,它们的区别在于是否可以被赋值,以及它们代表的内存位置。

左值(Lvalue):

  • 定义:左值表示一个可以出现在赋值符号(=)左边的表达式,通常是一个可以定位到内存地址的对象。
  • 特点:左值表示一个存储位置,可以对其进行赋值,因为它表示内存中的一个具体位置。
  • 例子:变量、数组元素、解引用的指针等都是左值。例如,g = 20; 中的 g 是左值,因为它可以接受赋值。
1
2
int g = 20;  // g 是左值
g = 30; // 可以对左值进行赋值

右值(Rvalue):

  • 定义:右值通常是一个没有明确内存地址的表达式。它表示一个临时的值或常量,通常只出现在赋值符号的右边。
  • 特点:右值不能出现在赋值符号的左边,因为它没有可以存储的内存位置,不能被赋值。
  • 例子:常量、字面值、表达式的计算结果(如 10 + 5)等都是右值。例如,10 = 20; 是非法的,因为 10 是右值,不能作为赋值的左边。
1
10 = 20;  // 错误,10 是右值,不能出现在赋值符号的左边

简单总结:

  • 左值:可以出现在赋值符号的左边,表示一个可以被修改的内存位置(如变量)。
  • 右值:只能出现在赋值符号的右边,表示一个临时的、无法修改的值(如常量或表达式的结果)。

正确的示例

1
2
int a = 10;   // a 是左值,10 是右值
a = 20; // 可以对 a(左值)赋值

错误的示例

1
10 = 20;  // 错误,10 是右值,不能作为赋值的左边

通过这种方式,你可以理解左值是可以被赋值和修改的存储位置,而右值则是一次性的值,不能直接进行赋值。