第2章 基本数据类型与变量
第2章 基本数据类型与变量
- 如何声明和使用变量来存储数据
- 理解整数、浮点数、字符等基本数据类型的区别
- 掌握变量的命名规则和初始化方法
想象一下你要整理一个工具箱。你需要知道螺丝刀、扳手、锤子各自放在哪个格子里,并且给每个格子贴上标签。在C++中,变量就是这些带标签的格子,而数据类型则决定了格子里能放什么工具(数据)。本章,我们就来学习如何创建和使用这些“数据格子”。
2.1 变量的声明与初始化
变量是程序存储数据的基本单元。声明一个变量,就是告诉编译器:“请给我预留一块内存,我打算用它来存某种类型的数据,并且给它起个名字。”
上面架构图展示了一个典型变量声明语句的构成。让我们看一个具体的代码例子:
// 变量声明与初始化
int score = 95; // 声明一个整型变量score,并初始化为95
double price = 19.99; // 声明一个双精度浮点变量price
char grade = 'A'; // 声明一个字符变量grade
bool isPassed = true; // 声明一个布尔变量isPassed
关键点:变量命名规则
C++变量名必须遵守以下规则:
- 只能由字母、数字和下划线(_)组成。
- 不能以数字开头。
- 不能是C++关键字(如int, double, if等)。
- 区分大小写(
Age和age是两个不同的变量)。
实际开发中,大部分团队会采用“驼峰命名法”(如studentAge)或“下划线命名法”(如student_age)来增强可读性。我建议初学者从一开始就养成好习惯。
常见误区
- 未初始化就使用:声明变量后没有赋值就直接使用,其值是“未定义”的垃圾数据,可能导致程序行为异常。例如:
int x; std::cout << x;输出是随机的。 - 使用错误的数据类型:试图将过大的整数存入
short类型,会发生“溢出”,结果会“绕回”。例如,对于最大值为32767的short,存入32768会变成-32768。 - 混淆赋值(=)与相等比较(==):这是新手最常见的语法错误之一,
if (x = 5)会把5赋值给x,并且条件永远为真,而if (x == 5)才是判断x是否等于5。
2.2 基本数据类型详解
C++提供了几种内置的基本数据类型,用于存储不同性质和范围的数值。选择合适的数据类型,就像为不同大小的物品选择合适的容器。
| 类型 | 含义 | 典型大小 | 表示范围(近似) | 示例 |
|---|---|---|---|---|
bool | 布尔型 | 1字节 | true 或 false | bool isReady = false; |
char | 字符型 | 1字节 | -128 到 127 或 0 到 255 | char letter = 'Z'; |
short | 短整型 | 2字节 | -32,768 到 32,767 | short month = 12; |
int | 整型 | 4字节 | -2.1×10⁹ 到 2.1×10⁹ | int population = 1412000000; |
long | 长整型 | 4或8字节 | 范围更大 | long bigNumber = 100000L; |
long long | 长长整型 | 8字节 | -9.2×10¹⁸ 到 9.2×10¹⁸ | long long distance = 9460730472580LL; |
float | 单精度浮点 | 4字节 | 约6-7位有效数字 | float pi = 3.14159f; |
double | 双精度浮点 | 8字节 | 约15-16位有效数字 | double precisePi = 3.141592653589793; |
整数类型用于存储没有小数部分的数字。选择时主要考虑数值范围。对于循环计数器,int是通用选择;对于明确范围很小的值(如月份),可以用short;处理文件大小、天文数字时,考虑long long。
浮点类型用于存储带小数部分的数字。float精度较低但占用空间小,double精度高,是科学计算和工程领域的默认选择。除非有明确的存储空间限制(如嵌入式开发),否则我推荐直接使用double。
概念:字符与布尔
字符(char):存储单个字符,如字母、数字、符号。用单引号包围,如'A'、'7'、'#'。字符在内存中实际存储的是其ASCII码值(一个整数)。
布尔(bool):只有两个值,true(真,通常内部表示为1)和false(假,通常内部表示为0)。主要用于逻辑判断条件。
// 字符与布尔类型示例
char firstInitial = 'J';
char newlineChar = '\n'; // 转义字符,表示换行
bool fileIsOpen = false;
bool result = (10 > 5); // result的值将为true
编者提示:关于signed/unsigned(有符号/无符号)修饰符、以及更精确的类型大小查询(使用sizeof运算符),我们将在后续关于运算符和内存布局的章节中深入探讨。
2.3 类型修饰符与常量
除了基本类型,我们还可以用修饰符来微调类型的属性,并用const来定义不可更改的值。
signed / unsigned
signed:可正可负(默认)unsigned:仅非负,使正数范围翻倍- 例:
unsigned int positiveCount;
short / long
- 修饰整数类型,改变其长度和范围
- 例:
long double(扩展精度浮点) - 例:
short int通常简写为short
const 常量
- 定义后值不可修改
- 提高代码安全性和可读性
- 例:
const double PI = 3.14159;
我在项目中踩过这个坑:一个用于存储数组大小的变量被声明为int,但后来数组可能增长,超过了int的正数范围。更好的做法是声明为size_t(一种无符号类型)或至少是unsigned int。对于永远不会改变的值,务必加上const,编译器会帮你避免意外的修改。
2.4 变量的作用域与生命周期
变量不是在任何地方都能被访问的,它有自己的“活动范围”和“存活时间”。
- 局部变量:在函数或代码块
{}内部声明。只在声明它的块内有效,离开即被销毁。这是最常见的变量类型。 - 全局变量:在所有函数(包括
main函数)之外声明。从声明处到文件末尾都有效。应谨慎使用,因为它们会增加代码的耦合度。
#include <iostream>
using namespace std;
int globalVar = 100; // 全局变量
int main() {
int localVar = 50; // 局部变量,仅在main函数内有效
{
int blockVar = 25; // 块内局部变量,仅在当前花括号内有效
cout << blockVar << endl; // 正确
cout << localVar << endl; // 正确
cout << globalVar << endl; // 正确
}
// cout << blockVar << endl; // 错误!blockVar在此处已不可见
cout << globalVar << endl; // 正确
return 0;
}
如果你在编译时看到“error: ‘xxx’ was not declared in this scope”这样的报错,大概率就是变量作用域的问题,你尝试在一个无法访问它的地方使用了它。
动手试一试
打开你的IDE,创建一个新文件practice_02.cpp,完成以下任务:
- 声明一个
double类型的变量radius,并初始化为5.0。 - 声明一个
const double类型的常量PI,值为3.14159。 - 计算圆的面积(面积 = PI * radius * radius),并将结果存储在一个新的
double变量area中。 - 使用
std::cout输出半径和面积,格式如:“半径:5, 面积:78.5398”。 - 尝试修改
PI常量的值(例如PI = 3.14;),观察编译器会给出什么错误信息。
检验你的理解
- 下面哪个变量名是合法的C++变量名?
A.2nd_placeB.my-variableC._tempD.float - 如果你想存储一个人的年龄(假设不超过150岁),最合适的数据类型是:
A.shortB.intC.long longD.double - 代码
int x; std::cout << x;的输出结果是什么?
A. 0 B. 一个不确定的随机值 C. 编译错误 D. 运行时报错 const int MAX_SIZE = 1024;这行语句定义的是一个______(变量/常量),它的值______(可以/不可以)在后续代码中被改变。
(答案:1.C 2.B 3.B 4.常量,不可以)
本章小结
- 变量是命名的内存存储单元,用于保存数据,使用前必须声明其类型和名称,并建议进行初始化。
- C++基本数据类型包括整数类型(
int,short,long long等)、浮点类型(float,double)、字符类型(char)和布尔类型(bool),选择类型需根据数据性质和范围决定。 - 类型修饰符(如
unsigned,const)可以改变类型的符号属性或定义不可变的常量。 - 变量具有作用域和生命周期,局部变量在其定义的代码块内有效,全局变量则在整个文件内有效,应优先使用局部变量。
微信扫码关注
抖音扫码关注