首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >《C++ 程序设计》第 2 章:C++ 语言简单程序设计

《C++ 程序设计》第 2 章:C++ 语言简单程序设计

作者头像
啊阿狸不会拉杆
发布2026-01-21 12:32:20
发布2026-01-21 12:32:20
970
举报
       大家好!今天我们来深入学习《C++ 程序设计》的第 2 章内容。本章作为 C++ 入门的核心基础,将带领大家掌握 C++ 的基本语法、数据类型、表达式、输入输出以及程序控制结构,为后续学习打下坚实基础。本文会结合大量可直接运行的代码示例和图解,让大家轻松上手~

思维导图(本章知识结构)

2.1 C++ 语言概述

2.1.1 C++ 语言的产生

        C++ 由 Bjarne Stroustrup 于 1983 年在贝尔实验室开发,最初名为 "C with Classes",旨在为 C 语言增加面向对象编程能力。1989 年正式更名为 C++,"++" 象征着在 C 语言基础上的增强。C++ 保持了 C 语言的高效性,同时引入了类、继承、多态等面向对象特性,成为系统开发、游戏引擎、高性能应用的主流语言。

2.1.2 C++ 语言的特点
  • 兼容性:几乎兼容所有 C 语言代码,支持过程式编程
  • 面向对象:支持类、封装、继承、多态
  • 泛型编程:通过模板实现通用算法
  • 高效性:接近汇编语言的执行效率,支持直接操作内存
  • 灵活性:支持多种编程范式(过程式、面向对象、泛型)
  • 丰富的标准库:提供容器、算法、I/O 等基础组件
2.1.3 C++ 语言程序实例

下面是一个简单的 C++ 程序,实现两数相加并输出结果:

代码语言:javascript
复制
// 包含输入输出流库,用于cout和cin
#include <iostream>

// 使用标准命名空间,避免每次都写std::
using namespace std;

// 程序入口函数,每个C++程序必须有且仅有一个main函数
int main() {
    // 定义两个整型变量a和b
    int a = 10;
    int b = 20;
    
    // 计算两数之和
    int sum = a + b;
    
    // 输出结果,endl表示换行并刷新缓冲区
    cout << "两数之和为:" << sum << endl;
    
    // main函数返回0表示程序正常结束
    return 0;
}

运行结果

程序结构说明

  1. #include <iostream>:预处理指令,引入标准输入输出库
  2. using namespace std:简化代码,可直接使用cout而非std::cout
  3. main():程序入口,操作系统从这里开始执行
  4. cout:标准输出流对象,用于输出信息
  5. return 0:表示程序成功执行完毕
2.1.4 字符集

C++ 的基本字符集包括:

  • 字母:A-Z、a-z(大小写敏感)
  • 数字:0-9
  • 特殊字符+ - * / = , ; . : ! ? ( ) [ ] { } < > & | ^ ~ % # _
  • 空白字符:空格、制表符 (\t)、换行符 (\n) 等(用于分隔词法记号,不影响逻辑)
2.1.5 词法记号

词法记号是 C++ 程序的基本语法单位,包括:

  • 关键字:C++ 预定义的保留词,如intiffor等(不能作为标识符)
  • 标识符:用户定义的名称(变量、函数等),规则:由字母、数字、下划线组成,首字符不能是数字,区分大小写
  • 常量:固定值,如1233.14"hello"
  • 运算符:如+-*/=
  • 分隔符:如;(语句结束)、,(元素分隔)、()(函数参数)等

2.2 基本数据类型和表达式

2.2.1 基本数据类型

C++ 的基本数据类型分为三大类:整数类型、浮点类型和字符类型。

类型

说明

典型大小 (32 位 / 64 位)

取值范围示例

bool

布尔类型

1 字节

true(1) 或 false(0)

char

字符类型

1 字节

-128~127 或 0~255

short

短整数

2 字节

-32768~32767

int

整数

4 字节

-2147483648~2147483647

long

长整数

4 字节 / 8 字节

同 int 或更大范围

long long

超长整数

8 字节

-9223372036854775808~9223372036854775807

float

单精度浮点数

4 字节

约 ±3.4e38,精度 6-7 位

double

双精度浮点数

8 字节

约 ±1.7e308,精度 15-17 位

long double

扩展精度浮点数

8/16 字节

精度更高

代码示例

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    // 布尔类型
    bool isTrue = true;
    // 字符类型(存储ASCII码)
    char ch = 'A';  // 等价于 char ch = 65;
    // 整数类型
    int age = 25;
    // 使用long long代替long存储大整数
    long long population = 7800000000LL;  // LL表示long long类型常量
    
    // 浮点类型
    float pi1 = 3.14f;  // f表示单精度
    double pi2 = 3.1415926535;
    
    // 输出各类型值
    cout << "布尔值:" << isTrue << endl;  // 输出1(true)
    cout << "字符:" << ch << ",对应的ASCII码:" << (int)ch << endl;  // 输出A和65
    cout << "年龄:" << age << endl;
    cout << "世界人口:" << population << endl;
    cout << "单精度π:" << pi1 << endl;
    cout << "双精度π:" << pi2 << endl;
    
    // 输出各整数类型的大小和范围(帮助理解)
    cout << "\n类型大小信息:" << endl;
    cout << "long类型大小:" << sizeof(long) << "字节" << endl;
    cout << "long long类型大小:" << sizeof(long long) << "字节" << endl;
    
    return 0;
}
2.2.2 常量

常量是程序运行中不可修改的值,分为:

  • 字面常量:直接写在代码中的值
    • 整数常量:123(十进制)、014(八进制,前缀 0)、0x0A(十六进制,前缀 0x)
    • 浮点常量:3.142.5e3(科学计数法,2.5×10³)
    • 字符常量:'a''\n'(转义字符,换行)
    • 字符串常量:"Hello"(本质是字符数组)
  • 转义字符:表示特殊字符,常见转义字符如下:

转义字符

含义

转义字符

含义

\n

换行

\t

水平制表符

\r

回车

\b

退格

\'

单引号

\"

双引号

\\

反斜杠

\0

空字符

2.2.3 变量

 变量是内存中的一块存储空间,用于存储可变化的数据,定义格式:数据类型 变量名 = 初始值;

变量定义与使用示例

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    // 定义变量并初始化
    int a = 10;  // 直接初始化
    int b(20);   // 括号初始化(C++风格)
    int c = 30;  // 传统赋值初始化(C++98兼容)
    
    // 先定义后赋值
    int d;
    d = 40;  // 赋值操作
    
    // 变量参与运算
    int sum = a + b + c + d;
    
    cout << "a=" << a << ", b=" << b << ", c=" << c << ", d=" << d << endl;
    cout << "总和:" << sum << endl;
    
    // 修改变量值
    a = 100;
    cout << "修改后a的值:" << a << endl;
    
    return 0;
}

运行结果

2.2.4 符号常量

        符号常量是用标识符表示的常量,提高代码可读性和可维护性,有两种定义方式:

  1. #define 常量名 常量值(预处理指令,无类型检查)
  2. const 数据类型 常量名 = 常量值;(有类型检查,更安全)

代码示例

代码语言:javascript
复制
#include <iostream>
using namespace std;

// 1. 使用#define定义符号常量(预处理阶段替换)
#define PI 3.14159
#define MAX_AGE 120

int main() {
    // 2. 使用const定义符号常量(编译阶段检查)
    const int MIN_AGE = 0;
    const double GRAVITY = 9.8;
    
    // 使用符号常量计算圆的面积
    double radius = 5.0;
    double area = PI * radius * radius;  // 等价于3.14159 * 5.0 * 5.0
    
    cout << "半径为" << radius << "的圆面积:" << area << endl;
    cout << "年龄范围:" << MIN_AGE << "~" << MAX_AGE << endl;
    cout << "重力加速度:" << GRAVITY << "m/s²" << endl;
    
    // 错误:符号常量不能被修改
    // PI = 3.14;  // 编译报错
    // MIN_AGE = 1;  // 编译报错
    
    return 0;
}

运行结果

建议:优先使用const定义符号常量,因为它有类型检查,更安全。

2.2.5 constexpr 与常量表达式

  constexpr是 C++11 引入的关键字,用于定义编译期常量,即可以在编译阶段计算出结果的表达式。

const 与 constexpr 的区别

  • const:运行时常量,初始化后不可修改,但初始化值可能在运行时确定
  • constexpr:编译期常量,初始化值必须在编译期确定,可用于需要编译期常量的场景(如数组大小)

代码示例

代码语言:javascript
复制
#include <iostream>
using namespace std;

// constexpr函数:编译期可计算的函数
constexpr int square(int x) {
    return x * x;
}

int main() {
    // constexpr变量:编译期确定值
    constexpr int a = 10;
    constexpr int b = square(5);  // 编译期计算5²=25
    
    // 正确:constexpr可用于数组大小(需要编译期常量)
    int arr[b] = {1, 2, 3, 4, 5};  // b=25,数组大小25
    
    // const变量:运行时常量(此处初始化值是编译期确定的,等价于constexpr)
    const int c = 20;
    // 错误:如果const变量初始化值是运行时确定的,则不能用于数组大小
    // int num;
    // cin >> num;
    // const int d = num;  // d是运行时常量
    // int arr2[d];  // 编译报错(C++不支持变长数组)
    
    cout << "a = " << a << endl;
    cout << "5的平方 = " << b << endl;
    cout << "数组第一个元素:" << arr[0] << endl;
    cout << "c = " << c << endl;
    
    return 0;
}
2.2.6 运算符与表达式

        运算符是用于执行运算的符号,表达式是运算符和操作数的组合。

常用运算符分类

类别

运算符示例

算术运算符

+ - * / % ++ --

赋值运算符

= += -= *= /= %=

比较运算符

== != > < >= <=

逻辑运算符

`! &&

`

位运算符

`&

^ ~ << >>`

条件运算符

?:(三目运算符)

逗号运算符

,

sizeof 运算符

sizeof(计算类型 / 变量大小)

表达式示例
代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    // 算术运算符
    int x = 10, y = 3;
    cout << "x + y = " << x + y << endl;  // 13
    cout << "x - y = " << x - y << endl;  // 7
    cout << "x * y = " << x * y << endl;  // 30
    cout << "x / y = " << x / y << endl;  // 3(整数除法取整)
    cout << "x % y = " << x % y << endl;  // 1(取余)
    
    // 自增自减运算符
    int a = 5;
    cout << "a++ = " << a++ << endl;  // 先输出5,再a=6
    cout << "++a = " << ++a << endl;  // 先a=7,再输出7
    int b = 5;
    cout << "b-- = " << b-- << endl;  // 先输出5,再b=4
    cout << "--b = " << --b << endl;  // 先b=3,再输出3
    
    // 赋值运算符
    int c = 10;
    c += 5;  // 等价于c = c + 5 → c=15
    cout << "c += 5 → c = " << c << endl;
    
    // 比较运算符
    cout << "x > y ? " << (x > y) << endl;  // 1(true)
    cout << "x == y ? " << (x == y) << endl;  // 0(false)
    
    // 逻辑运算符
    bool isAdult = true;
    bool hasID = false;
    cout << "是否成年且有身份证?" << (isAdult && hasID) << endl;  // 0(false)
    cout << "是否成年或有身份证?" << (isAdult || hasID) << endl;  // 1(true)
    cout << "是否未成年?" << !isAdult << endl;  // 0(false)
    
    // 三目运算符:条件 ? 表达式1 : 表达式2
    int score = 85;
    string result = (score >= 60) ? "及格" : "不及格";
    cout << "成绩结果:" << result << endl;  // 及格
    
    // sizeof运算符:计算类型或变量大小(单位:字节)
    cout << "int类型大小:" << sizeof(int) << "字节" << endl;  // 4字节
    cout << "x变量大小:" << sizeof(x) << "字节" << endl;  // 4字节
    
    return 0;
}

注意:运算符有优先级和结合性,不确定时建议使用括号明确优先级,例如(a + b) * c

2.2.7 语句

语句是程序的基本执行单位,C++ 中常用语句包括:

  • 表达式语句:表达式后加;,如a = 10;cout << "hello";
  • 空语句:单独的;,表示什么也不做
  • 复合语句(块语句):用{}包围的一组语句,如{ int a=1; int b=2; }
  • 控制语句:用于控制程序流程,如ifforwhile等(后续章节详细讲解)

2.3 数据的输入与输出

2.3.1 I/O 流

C++ 的输入输出通过流(Stream) 实现,流是数据的流动序列:

  • 输入流(Input Stream):数据从外部设备(如键盘)流向程序
  • 输出流(Output Stream):数据从程序流向外部设备(如屏幕)

标准 I/O 流对象:

  • cin:标准输入流(对应键盘)
  • cout:标准输出流(对应屏幕)
  • cerr:标准错误流(对应屏幕,无缓冲,立即输出错误信息)
  • clog:标准日志流(对应屏幕,有缓冲)
2.3.2 预定义的插入符和提取符
  • <<:插入符,用于输出数据到流(如cout << x;
  • >>:提取符,用于从流读取数据(如cin >> x;

代码示例

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    // 定义变量存储输入数据
    int age;
    string name;
    double height;
    
    // 输出提示信息
    cout << "请输入你的姓名:";
    // 读取字符串(遇到空格或换行停止)
    cin >> name;
    
    cout << "请输入你的年龄:";
    // 读取整数
    cin >> age;
    
    cout << "请输入你的身高(米):";
    // 读取浮点数
    cin >> height;
    
    // 输出用户信息
    cout << endl << "===== 个人信息 =====" << endl;
    cout << "姓名:" << name << endl;
    cout << "年龄:" << age << "岁" << endl;
    cout << "身高:" << height << "米" << endl;
    
    return 0;
}

运行示例

2.3.3 简单的 I/O 格式控制

        通过<iomanip>头文件中的函数可以控制 I/O 格式,常用格式控制符:

控制符

功能

setw(n)

设置输出宽度为 n 个字符

setprecision(n)

设置浮点数精度(n 为有效数字)

fixed

固定小数位数模式

left/right

左对齐 / 右对齐

setfill(c)

设置填充字符为 c

hex/oct/dec

以十六进制 / 八进制 / 十进制输出整数

代码示例

代码语言:javascript
复制
#include <iostream>
#include <iomanip>  // 包含格式控制函数
#include <string>
using namespace std;

int main() {
    // 输出宽度和对齐
    cout << "===== 宽度和对齐示例 =====" << endl;
    cout << left << setw(10) << "姓名" << setw(5) << "年龄" << setw(8) << "身高" << endl;
    cout << left << setw(10) << "张三" << setw(5) << 20 << setw(8) << 1.75 << endl;
    cout << left << setw(10) << "李四" << setw(5) << 22 << setw(8) << 1.82 << endl;
    
    // 浮点数精度控制
    cout << endl << "===== 浮点数精度示例 =====" << endl;
    double pi = 3.141592653589793;
    cout << "默认精度:" << pi << endl;  // 默认6位有效数字
    cout << "8位有效数字:" << setprecision(8) << pi << endl;
    cout << "2位小数:" << fixed << setprecision(2) << pi << endl;  // fixed固定小数位数
    
    // 整数进制输出
    cout << endl << "===== 整数进制示例 =====" << endl;
    int num = 255;
    cout << "十进制:" << dec << num << endl;  // 255
    cout << "八进制:" << oct << num << endl;  // 377(前缀0可手动添加)
    cout << "十六进制(小写):" << hex << num << endl;  // ff
    cout << "十六进制(大写):" << uppercase << num << endl;  // FF
    
    // 填充字符
    cout << endl << "===== 填充字符示例 =====" << endl;
    cout << right << setw(10) << setfill('*') << 123 << endl;  // *******123(宽度10,右对齐,*填充)
    
    return 0;
}

2.4 算法的基本控制结构

        算法的三大基本控制结构:顺序结构(默认)、选择结构(分支)、循环结构(重复)。

2.4.1 用 if 语句实现选择结构

    if语句用于根据条件执行不同的代码块,基本格式:

代码语言:javascript
复制
// 单分支
if (条件表达式) {
    // 条件为true时执行
}

// 双分支
if (条件表达式) {
    // 条件为true时执行
} else {
    // 条件为false时执行
}

// 多分支
if (条件1) {
    // 条件1为true时执行
} else if (条件2) {
    // 条件2为true时执行
} else {
    // 所有条件都为false时执行
}

综合案例:成绩等级判断

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    // 输入成绩
    int score;
    cout << "请输入你的成绩(0-100):";
    cin >> score;
    
    // 验证成绩合法性
    if (score < 0 || score > 100) {
        cout << "成绩输入错误!请输入0-100之间的数。" << endl;
        return 1;  // 非0表示程序异常结束
    }
    
    // 判断成绩等级
    char level;
    if (score >= 90) {
        level = 'A';
    } else if (score >= 80) {  // 隐含条件:score < 90
        level = 'B';
    } else if (score >= 60) {  // 隐含条件:score < 80
        level = 'C';
    } else {  // 隐含条件:score < 60
        level = 'D';
    }
    
    // 输出结果
    cout << "你的成绩等级是:" << level << endl;
    
    return 0;
}

运行示例

2.4.2 多重选择结构

        当需要从多个选项中选择时,可使用switch语句,格式:

代码语言:javascript
复制
switch (表达式) {
    case 常量1:
        // 语句1
        break;  // 跳出switch
    case 常量2:
        // 语句2
        break;
    ...
    default:
        // 所有case都不匹配时执行
        break;
}

注意

  • 表达式结果必须是整数类型(int、char 等)或枚举类型
  • case后必须是常量表达式
  • break用于跳出switch,否则会继续执行下一个case(穿透现象)

综合案例:简易计算器

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    double num1, num2;
    char op;
    
    // 输入运算数和运算符
    cout << "请输入表达式(格式:数字 运算符 数字):";
    cin >> num1 >> op >> num2;
    
    // 根据运算符选择运算
    switch (op) {
        case '+':
            cout << num1 << " + " << num2 << " = " << num1 + num2 << endl;
            break;
        case '-':
            cout << num1 << " - " << num2 << " = " << num1 - num2 << endl;
            break;
        case '*':
            cout << num1 << " * " << num2 << " = " << num1 * num2 << endl;
            break;
        case '/':
            // 判断除数是否为0
            if (num2 == 0) {
                cout << "错误:除数不能为0!" << endl;
            } else {
                cout << num1 << " / " << num2 << " = " << num1 / num2 << endl;
            }
            break;
        default:
            cout << "错误:不支持的运算符!" << endl;
            break;
    }
    
    return 0;
}

运行示例

2.4.3 循环结构

        循环结构用于重复执行一段代码,C++ 提供三种循环语句:forwhiledo-while

1. while 循环

格式

代码语言:javascript
复制
while (条件表达式) {
    // 循环体
}

执行流程先判断条件,条件为 true 则执行循环体,重复此过程直到条件为 false。

2. do-while 循环

格式

代码语言:javascript
复制
do {
    // 循环体
} while (条件表达式);

执行流程先执行一次循环体,再判断条件,条件为 true 则继续循环,否则结束(至少执行一次)。

3. for 循环

格式

代码语言:javascript
复制
for (初始化; 条件表达式; 更新表达式) {
    // 循环体
}

执行流程:初始化→判断条件→条件 true 执行循环体→更新表达式→重复判断条件...

代码示例:三种循环对比

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    // 1. while循环:计算1-10的和
    int sum1 = 0;
    int i = 1;
    while (i <= 10) {
        sum1 += i;  // 等价于sum1 = sum1 + i
        i++;        // 变量自增
    }
    cout << "while循环计算1-10的和:" << sum1 << endl;  // 55
    
    // 2. do-while循环:输入密码直到正确
    string password;
    const string correctPwd = "123456";
    do {
        cout << "请输入密码:";
        cin >> password;
        if (password != correctPwd) {
            cout << "密码错误,请重新输入!" << endl;
        }
    } while (password != correctPwd);
    cout << "密码正确,登录成功!" << endl;
    
    // 3. for循环:打印1-10的偶数
    cout << "1-10的偶数:";
    for (int j = 1; j <= 10; j++) {
        if (j % 2 == 0) {  // 判断是否为偶数
            cout << j << " ";
        }
    }
    cout << endl;
    
    // 4. for循环:打印5*5乘法表
    cout << endl << "5*5乘法表:" << endl;
    for (int row = 1; row <= 5; row++) {  // 行循环
        for (int col = 1; col <= row; col++) {  // 列循环(列数≤行数)
            cout << col << "*" << row << "=" << col*row << "\t";
        }
        cout << endl;  // 每行结束换行
    }
    
    return 0;
}
2.4.4 循环结构与选择结构的嵌套

        循环内部可以嵌套选择结构,选择结构内部也可以嵌套循环,用于实现复杂逻辑。

综合案例:素数判断与输出

代码语言:javascript
复制
#include <iostream>
#include <cmath>  // 用于sqrt函数
using namespace std;

// 判断一个数是否为素数(只能被1和自身整除的大于1的整数)
bool isPrime(int num) {
    if (num <= 1) {
        return false;  // 1不是素数
    }
    // 优化:只需判断到sqrt(num)
    for (int i = 2; i <= sqrt(num); i++) {
        if (num % i == 0) {  // 能被i整除,不是素数
            return false;
        }
    }
    return true;  // 是素数
}

int main() {
    int n;
    cout << "请输入一个正整数n:";
    cin >> n;
    
    // 输出1-n之间的所有素数
    cout << "1-" << n << "之间的素数有:";
    for (int i = 2; i <= n; i++) {
        if (isPrime(i)) {  // 嵌套选择结构(if)
            cout << i << " ";
        }
    }
    cout << endl;
    
    return 0;
}

运行示例

2.4.5 其他控制语句
1. break 语句
  • 用于switch中:跳出switch结构
  • 用于循环中:跳出当前循环,执行循环后的代码
2. continue 语句
  • 用于循环中:跳过本次循环剩余部分,直接进入下一次循环
3. goto 语句
  • 无条件跳转到指定标签处,格式:goto 标签; 和 标签: 语句;
  • 注意:过度使用 goto 会导致程序结构混乱,建议少用

代码示例

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    // break示例:找到100以内第一个能被13和7同时整除的数
    int num;
    for (num = 1; num <= 100; num++) {
        if (num % 13 == 0 && num % 7 == 0) {
            break;  // 找到后跳出循环
        }
    }
    cout << "100以内第一个能被13和7同时整除的数:" << num << endl;  // 91
    
    // continue示例:输出1-10中的奇数
    cout << "1-10中的奇数:";
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            continue;  // 是偶数则跳过本次循环剩余部分
        }
        cout << i << " ";
    }
    cout << endl;  // 输出1 3 5 7 9
    
    // goto示例:模拟游戏重试功能
    retry:  // 标签
    cout << endl << "游戏开始!请选择:1-继续,0-退出:";
    int choice;
    cin >> choice;
    if (choice == 1) {
        cout << "游戏进行中...游戏失败!" << endl;
        goto retry;  // 跳转到retry标签,重新开始
    } else {
        cout << "游戏结束!" << endl;
    }
    
    return 0;
}

2.5 类型别名与类型推断

2.5.1 类型别名

        类型别名是给已有的类型起一个新名字,提高代码可读性,两种定义方式:

  • typedef 原类型 别名;
  • using 别名 = 原类型;(C++11 引入,更推荐)

代码示例

代码语言:javascript
复制
#include <iostream>
#include <vector>  // 标准容器vector
using namespace std;

// 1. typedef定义类型别名
typedef int Age;  // Age是int的别名
typedef vector<int> IntVector;  // IntVector是vector<int>的别名

// 2. using定义类型别名(更直观,推荐)
using Score = double;  // Score是double的别名
using StringVector = vector<string>;  // StringVector是vector<string>的别名

int main() {
    // 使用类型别名定义变量
    Age userAge = 25;  // 等价于int userAge = 25;
    Score mathScore = 95.5;  // 等价于double mathScore = 95.5;
    
    // 使用容器类型别名
    IntVector numbers = {1, 2, 3, 4, 5};  // 等价于vector<int> numbers = ...
    StringVector names = {"Alice", "Bob", "Charlie"};  // 等价于vector<string> names = ...
    
    cout << "年龄:" << userAge << endl;
    cout << "数学成绩:" << mathScore << endl;
    
    cout << "数字列表:";
    for (int num : numbers) {  // 范围for循环
        cout << num << " ";
    }
    cout << endl;
    
    cout << "姓名列表:";
    for (const string& name : names) {
        cout << name << " ";
    }
    cout << endl;
    
    return 0;
}
2.5.2 auto 类型与 decltype 类型
1. auto 类型

auto用于自动推断变量类型,编译器根据初始化值推断变量类型,简化代码。

使用场景

  • 变量类型较长或复杂时(如容器迭代器)
  • 不确定变量类型时
2. decltype 类型

decltype用于推断表达式的类型,但不计算表达式的值,格式:decltype(表达式) 变量名;

auto 与 decltype 的区别

  • auto根据初始化值推断类型,必须初始化
  • decltype根据表达式推断类型,变量可以不初始化

代码示例

代码语言:javascript
复制
#include <iostream>
#include <vector>
using namespace std;

// C++98不支持auto返回类型,需显式指定
int add(int a, int b) {
    return a + b;
}

int main() {
    // 用具体类型替代auto
    int a = 10;
    double b = 3.14;
    char c = 'A';
    const char* d = "hello";
    
    cout << "a的类型是int,值:" << a << endl;
    cout << "b的类型是double,值:" << b << endl;
    cout << "c的类型是char,值:" << c << endl;
    cout << "d的类型是const char*,值:" << d << endl;
    
    // C++98初始化vector的方式
    vector<int> nums;
    nums.push_back(1);
    nums.push_back(2);
    nums.push_back(3);
    nums.push_back(4);
    nums.push_back(5);
    
    // 用迭代器类型替代auto
    vector<int>::iterator it = nums.begin();
    cout << "vector第一个元素:" << *it << endl;
    
    // 用具体类型替代decltype
    int e;
    e = 30;
    
    int f;  // x+y是int类型
    f = a + b;
    
    cout << "e = " << e << endl;
    cout << "f = " << f << endl;
    cout << "add(5, 3) = " << add(5, 3) << endl;
    
    return 0;
}

2.6 深度探索

2.6.1 变量的实现机制

        变量本质是内存中的一块存储空间,每个变量有三个核心属性:

  • 名称:程序员使用的标识符
  • 地址:内存单元的编号(通过&运算符获取)
  • :存储在内存单元中的数据

内存分配原理

  • 程序运行时,操作系统为程序分配内存,分为栈区、堆区、全局区等
  • 局部变量存储在栈区,由编译器自动分配和释放
  • 全局变量存储在全局区,程序启动时分配,结束时释放

代码示例:探索变量地址与内存

代码语言:javascript
复制
#include <iostream>
using namespace std;

// 全局变量(存储在全局区)
int globalVar = 100;

int main() {
    // 局部变量(存储在栈区)
    int localVar = 200;
    double doubleVar = 3.14159;
    
    // 输出变量值和地址(&运算符获取地址)
    cout << "全局变量globalVar:" << endl;
    cout << "  值:" << globalVar << endl;
    cout << "  地址:" << &globalVar << endl;  // 地址格式如0x404000
    
    cout << "\n局部变量localVar:" << endl;
    cout << "  值:" << localVar << endl;
    cout << "  地址:" << &localVar << endl;
    
    cout << "\n变量doubleVar:" << endl;
    cout << "  值:" << doubleVar << endl;
    cout << "  地址:" << &doubleVar << endl;
    cout << "  大小:" << sizeof(doubleVar) << "字节" << endl;  // 8字节
    
    // 通过指针访问变量(指针存储变量地址)
    int* p = &localVar;  // p是指向int的指针,存储localVar的地址
    cout << "\n通过指针访问localVar:" << *p << endl;  // *p获取指针指向的值
    *p = 300;  // 通过指针修改变量值
    cout << "修改后localVar的值:" << localVar << endl;  // 300
    
    return 0;
}
2.6.2 C++ 语言表达式的执行原理

        表达式的执行遵循运算符优先级结合性,但复杂表达式可能存在未定义行为(如i = i++)。

执行原理

  1. 编译器将表达式转换为抽象语法树后缀表达式(逆波兰式)
  2. 按照运算符优先级和结合性计算
  3. 对于有副作用的运算符(如++--),需注意执行顺序

未定义行为示例

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    // 1. 运算符优先级示例
    int a = 10 + 20 * 3;  // 先算乘法20*3=60,再加10→70
    int b = (10 + 20) * 3;  // 先算括号内→30*3=90
    cout << "a = 10 + 20 * 3 = " << a << endl;
    cout << "b = (10 + 20) * 3 = " << b << endl;
    
    // 2. 结合性示例(赋值运算符右结合)
    int x, y, z;
    x = y = z = 5;  // 等价于x = (y = (z = 5))
    cout << "\nx = " << x << ", y = " << y << ", z = " << z << endl;  // 都为5
    
    // 3. 未定义行为:不要在一个表达式中多次修改同一变量
    int i = 5;
    // 以下代码行为未定义,不同编译器可能有不同结果
    // int j = i++ + ++i;  // 危险!不要这样写
    // cout << "j = " << j << endl;
    
    // 4. 短路求值:逻辑运算符的优化
    int k = 0;
    // 逻辑与:第一个条件为false,第二个条件不执行
    if (k != 0 && (10 / k > 1)) {  // k=0,第一个条件false,避免除0错误
        cout << "条件成立" << endl;
    } else {
        cout << "条件不成立(逻辑与短路)" << endl;
    }
    
    // 逻辑或:第一个条件为true,第二个条件不执行
    if (k == 0 || (10 / k > 1)) {  // 第一个条件true,避免除0错误
        cout << "条件成立(逻辑或短路)" << endl;
    } else {
        cout << "条件不成立" << endl;
    }
    
    return 0;
}

注意:避免编写依赖未定义行为的代码,确保表达式执行顺序明确。

2.7 小结

本章介绍了 C++ 语言的基础语法和核心概念,是学习 C++ 的基石,主要内容包括:

  1. C++ 概述:C++ 的产生背景、特点和基本程序结构,掌握main函数、cout输出等基础。
  2. 数据类型与表达式:基本数据类型(int、double 等)、常量与变量、运算符与表达式,理解constconstexpr的区别。
  3. 输入输出:通过cincout实现数据输入输出,掌握<<>>运算符,以及简单的格式控制。
  4. 控制结构:选择结构(ifswitch)和循环结构(forwhiledo-while),能通过控制语句实现复杂逻辑。
  5. 类型工具:类型别名(typedefusing)和类型推断(autodecltype),简化代码并提高可读性。
  6. 深度探索:了解变量的内存实现机制和表达式执行原理,帮助理解程序运行本质。

        通过本章学习,应能独立编写简单的 C++ 程序,实现数据的输入、处理和输出,并掌握基本的算法控制结构。建议多动手练习,通过实际编程巩固知识点,为后续学习面向对象编程打下基础。

        希望本文对大家学习 C++ 有所帮助!如果有任何问题或建议,欢迎在评论区留言~👍

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思维导图(本章知识结构)
  • 2.1 C++ 语言概述
    • 2.1.1 C++ 语言的产生
    • 2.1.2 C++ 语言的特点
    • 2.1.3 C++ 语言程序实例
    • 2.1.4 字符集
    • 2.1.5 词法记号
  • 2.2 基本数据类型和表达式
    • 2.2.1 基本数据类型
    • 2.2.2 常量
    • 2.2.3 变量
    • 2.2.4 符号常量
    • 2.2.5 constexpr 与常量表达式
    • 2.2.6 运算符与表达式
      • 常用运算符分类
      • 表达式示例
    • 2.2.7 语句
  • 2.3 数据的输入与输出
    • 2.3.1 I/O 流
    • 2.3.2 预定义的插入符和提取符
    • 2.3.3 简单的 I/O 格式控制
  • 2.4 算法的基本控制结构
    • 2.4.1 用 if 语句实现选择结构
    • 2.4.2 多重选择结构
    • 2.4.3 循环结构
      • 1. while 循环
      • 2. do-while 循环
      • 3. for 循环
    • 2.4.4 循环结构与选择结构的嵌套
    • 2.4.5 其他控制语句
      • 1. break 语句
      • 2. continue 语句
      • 3. goto 语句
  • 2.5 类型别名与类型推断
    • 2.5.1 类型别名
    • 2.5.2 auto 类型与 decltype 类型
      • 1. auto 类型
      • 2. decltype 类型
  • 2.6 深度探索
    • 2.6.1 变量的实现机制
    • 2.6.2 C++ 语言表达式的执行原理
  • 2.7 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档