搜索

C++ 教程

C++基础

第1章 搭建开发环境与第一个程序 第2章 基本数据类型与变量 第3章 运算符与表达式 第4章 流程控制语句 第5章 数组与字符串 第6章 函数基础 第7章 指针基础 第8章 引用与const限定 第9章 动态内存管理 第10章 结构体与联合体 第11章 函数进阶

面向对象

第12章 面向对象编程入门 第13章 封装与访问控制 第14章 运算符重载 第15章 继承与派生 第16章 多态与虚函数

STL与进阶

第17章 模板编程基础 第18章 标准模板库(STL)容器 第19章 STL算法与迭代器 第20章 异常处理机制 第21章 文件输入输出 第22章 字符串类string 第23章 命名空间与作用域 第24章 类型转换操作符

现代C++

第25章 智能指针 第26章 移动语义与右值引用 第27章 Lambda表达式 第28章 多线程编程基础 第29章 模板元编程入门 第30章 设计模式基础 第31章 C++11/14新特性 第32章 C++17/20核心特性

实战进阶

第33章 性能优化技巧 第34章 调试与测试 第35章 项目结构与构建 第36章 网络编程入门 第37章 数据库连接操作 第38章 图形界面开发基础 第39章 综合项目实战 第40章 进阶学习路线

第2章 基本数据类型与变量

第2章 基本数据类型与变量

入门 👤 刚完成第一个C++程序的初学者 🔧 存储和处理程序中各种数据的基础
本章你将学到
  • 如何声明和使用变量来存储数据
  • 理解整数、浮点数、字符等基本数据类型的区别
  • 掌握变量的命名规则和初始化方法
核心概念变量数据类型

想象一下你要整理一个工具箱。你需要知道螺丝刀、扳手、锤子各自放在哪个格子里,并且给每个格子贴上标签。在C++中,变量就是这些带标签的格子,而数据类型则决定了格子里能放什么工具(数据)。本章,我们就来学习如何创建和使用这些“数据格子”。

2.1 变量的声明与初始化

变量是程序存储数据的基本单元。声明一个变量,就是告诉编译器:“请给我预留一块内存,我打算用它来存某种类型的数据,并且给它起个名字。”

数据类型
+
变量名
=
初始值
↓
int
+
age
=
25

上面架构图展示了一个典型变量声明语句的构成。让我们看一个具体的代码例子:

// 变量声明与初始化
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++提供了几种内置的基本数据类型,用于存储不同性质和范围的数值。选择合适的数据类型,就像为不同大小的物品选择合适的容器。

C++基本数据类型(以64位Linux/macOS系统常见实现为例)
类型含义典型大小表示范围(近似)示例
bool布尔型1字节true 或 falsebool isReady = false;
char字符型1字节-128 到 127 或 0 到 255char letter = 'Z';
short短整型2字节-32,768 到 32,767short 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,编译器会帮你避免意外的修改。

确定需要存储的数据
→
是整数还是小数?
→
整数
↓
估计数值范围 → 选择 int/short/long long
小数
↓
需要高精度? → 是:double / 否:float
→
值会变吗? → 会:变量 / 不会: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,完成以下任务:

  1. 声明一个double类型的变量radius,并初始化为5.0。
  2. 声明一个const double类型的常量PI,值为3.14159。
  3. 计算圆的面积(面积 = PI * radius * radius),并将结果存储在一个新的double变量area中。
  4. 使用std::cout输出半径和面积,格式如:“半径:5, 面积:78.5398”。
  5. 尝试修改PI常量的值(例如PI = 3.14;),观察编译器会给出什么错误信息。

检验你的理解

  1. 下面哪个变量名是合法的C++变量名?
    A. 2nd_place B. my-variable C. _temp D. float
  2. 如果你想存储一个人的年龄(假设不超过150岁),最合适的数据类型是:
    A. short B. int C. long long D. double
  3. 代码 int x; std::cout << x; 的输出结果是什么?
    A. 0 B. 一个不确定的随机值 C. 编译错误 D. 运行时报错
  4. const int MAX_SIZE = 1024; 这行语句定义的是一个______(变量/常量),它的值______(可以/不可以)在后续代码中被改变。

(答案:1.C 2.B 3.B 4.常量,不可以)

本章小结

  • 变量是命名的内存存储单元,用于保存数据,使用前必须声明其类型和名称,并建议进行初始化。
  • C++基本数据类型包括整数类型(int, short, long long等)、浮点类型(float, double)、字符类型(char)和布尔类型(bool),选择类型需根据数据性质和范围决定。
  • 类型修饰符(如unsigned, const)可以改变类型的符号属性或定义不可变的常量。
  • 变量具有作用域和生命周期,局部变量在其定义的代码块内有效,全局变量则在整个文件内有效,应优先使用局部变量。

意见反馈

微信二维码 微信扫码关注 抖音二维码 抖音扫码关注