1.4 控制流

“控制流” 是 “程序执行的顺序”—— 默认情况下,程序按 “从上到下、从左到右” 的顺序执行;但实际需求中,我们需要 “根据条件判断是否执行某段代码”(分支)或 “重复执行某段代码”(循环)。本节介绍 C++ 最基础的两种控制流语句:if(分支)和for(循环)。

1.4.1 if语句:条件分支

if语句的作用是 “如果某个条件成立,就执行一段代码;否则执行另一段代码(可选)”。

语法结构
// 单分支:条件成立则执行if (条件表达式) {    代码块1;  // 条件为true时执行}// 双分支:条件成立执行代码块1,否则执行代码块2if (条件表达式) {    代码块1;  // 条件为true时执行} else {    代码块2;  // 条件为false时执行}
  • 条件表达式:必须是 “布尔类型”(bool)——true(真,非 0 值会被当作true)或false(假,0 会被当作false)。

  • 代码块:若只有一条语句,{}可以省略;但为了代码清晰、避免后续修改出错(如误加语句),建议无论多少条语句都加{}

示例:判断一个数是否为正数
#include<iostream>usingnamespace std;intmain(){    int num;    cout << "请输入一个整数:";    cin >> num;    if (num > 0) {  // 条件:num大于0        cout << num << "是正数" << endl;    } elseif (num < 0) {  // 额外分支:num小于0(else if可多个)        cout << num << "是负数" << endl;    } else {  // 剩余情况:num等于0        cout << num << "是零" << endl;    }    return0;}

1.4.2 for语句:循环

for语句的作用是 “重复执行一段代码,直到满足终止条件”—— 特别适合 “已知循环次数” 的场景(如遍历 1 到 10 的整数)。

语法结构
for (初始化表达式; 条件表达式; 更新表达式) {    循环体;  // 条件为true时执行,执行后更新表达式}
  • 初始化表达式:循环开始前执行一次,通常用于定义和初始化循环变量(如int i = 0)。

  • 条件表达式:每次执行循环体前判断 —— 若为true,执行循环体;若为false,退出循环。

  • 更新表达式:每次执行完循环体后执行,通常用于更新循环变量(如i++,让i自增 1)。

示例:计算 1 到 10 的和
#include<iostream>usingnamespace std;intmain(){    int sum = 0;  // 存储总和,初始值为0    // 循环:i从1到10(共10次)    for (int i = 1; i <= 10; ++i) {        sum += i;  // 等价于sum = sum + i,每次将i加到sum中    }    cout << "1到10的和是:" << sum << endl;  // 输出结果:55    return0;}
循环变量的作用域
  • 上述代码中,int i = 1是在for的 “初始化表达式” 中定义的 —— 根据 C++11 标准,这样的i作用域仅限于for循环内部(循环结束后,i就不能再使用了),这是推荐的写法(避免变量污染外部作用域)。

  • 若在for循环外定义i(如int i; for (i = 1; ...)),则i的作用域会延伸到for循环之后,不推荐。

1.5 类简介

C++ 是 “面向对象编程语言”,而 “类”(class)是面向对象的核心 —— 类的作用是 “封装数据(属性)和操作数据的函数(方法)”,形成一个 “自定义类型”。本节不深入讲解类的实现,而是通过 C++ 标准库中的Sales_item类,让读者初步理解 “如何使用类”(后续章节会详细讲解类的定义和封装)。

1.5.1 Sales_item类的作用

Sales_item是一个 “用于处理书籍销售数据的类”,封装了以下信息(数据)和操作(方法):

  • 数据:书籍的 ISBN 编号(唯一标识一本书)、销售数量、单价、总销售额。

  • 方法:

    • 读取销售记录(从cin读取)。

    • 输出销售记录(到cout输出)。

    • 累加销售记录(将两本相同 ISBN 的书的销售数量和总销售额相加)。

1.5.2 使用Sales_item类的前提

要使用Sales_item类,需要满足两个条件:

  1. 包含头文件

    #include "Sales_item.h"—— 注意这里用的是双引号"",而非尖括号<>

    • 尖括号<>:用于包含标准库头文件(如<iostream>),编译器会到 “系统标准库目录” 中查找。

    • 双引号"":用于包含自定义头文件(如Sales_item.h,通常是自己写的或第三方库的头文件),编译器会先到 “当前源文件所在目录” 查找,找不到再到系统标准库目录查找。

  2. 获取Sales_item.h文件

    :该文件不是 C++ 标准库的默认文件,需要从《C++ Primer》的官方网站(或配套资源)下载,并存放在与源文件相同的目录中。

1.5.3 示例:使用Sales_item处理销售数据

#include<iostream>#include"Sales_item.h"  // 包含Sales_item类的头文件usingnamespace std;intmain(){    Sales_item book1, book2;  // 定义两个Sales_item类型的变量(类似int a;)    // 读取两本相同ISBN的书的销售记录    cout << "请输入第一本书的销售记录(ISBN 数量 单价):";    cin >> book1;  // 调用Sales_item的输入方法    cout << "请输入第二本书的销售记录(ISBN 数量 单价):";    cin >> book2;    // 检查两本书的ISBN是否相同(==运算符被Sales_item重载了)    if (book1.isbn() == book2.isbn()) {        Sales_item total = book1 + book2;  // 累加销售记录(+运算符被重载了)        cout << "两本书的总销售记录:" << total << endl;  // 输出总记录        return0;    } else {        cerr << "两本书的ISBN不同,无法累加!" << endl;  // cerr:标准错误流        return-1;  // 返回非0值,表示程序异常结束    }}
关键概念:运算符重载
  • 上述代码中,cin >> book1book1 + book2book1.isbn() == book2.isbn()等操作,看起来是 “对类的对象使用标准运算符”—— 这是 C++ 的 “运算符重载” 特性:类可以自定义>>+==等运算符的行为,让对象的操作更直观(就像操作intdouble等基本类型一样)。

  • cerr

    :是 “标准错误流”,与cout的区别是:cerr不缓冲,错误信息会立即显示;而cout是缓冲的,可能延迟显示 —— 通常用cerr输出错误信息。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐