C++系列(二):告别低效循环!选择、循环、跳转原理与优化实战全解析

引言

闯过C++基础"新手村"(注释、变量、数据类型...),是否已摩拳擦掌,渴望指挥程序执行更复杂的任务?流程控制,就是赋予程序逻辑与生命的核心技能! 本指南作为《彻底吃透C++基础核心》的进阶篇章,将带你深度解锁"选择结构"(if/三目/switch)、"循环结构"(while/do-while/for/嵌套)与"跳转语句"(break/continue/goto)三大核心武器库。

告别代码的平铺直叙,你将学会:如何让程序智能决策(成绩精准评级?Switch优化有妙招!)、如何高效重复(快速判断素数?循环优化是关键!)、如何精准控制执行流(何时中断循环?Break/Continue怎么选?)。我们更将剖析循环效率差异,揭示常见陷阱,并融入最佳实践建议,助你写出高效、优雅、易维护的C++代码。

掌握流程控制,方能真正驾驭程序逻辑! 准备好升级你的编程战力了吗?这份"新手村通关秘籍",将是你攻克C++核心堡垒的制胜法宝!

最后,如果大家喜欢我的创作风格 ,请大家多多关注up主,你们的支持就是我创作最大的动力!如果各位观众老爷觉得我哪些地方需要改进,请一定在评论区告诉我,马上改!在此感谢大家了。

各位观众老爷,本文通俗易懂,快速熟悉C++,收藏本文,关注up不迷路,后续将持续分享C++纯干货(请观众老爷放心,绝对又干又通俗易懂)。请多多关注、收藏、评论,评论区等你~~~


文章目录

  • 引言
  • 一、选择结构
    • [1.1 if 语句](#1.1 if 语句)
    • [1.2 三目运算符](#1.2 三目运算符)
    • [1.3 switch 语句](#1.3 switch 语句)
  • 二、循环结构
    • [2.1 while 循环](#2.1 while 循环)
    • [2.2 do-while 循环](#2.2 do-while 循环)
    • [2.3 for 循环](#2.3 for 循环)
    • [2.4 嵌套循环](#2.4 嵌套循环)
  • 三、跳转语句
    • [3.1 break 语句](#3.1 break 语句)
    • [3.2 continue 语句](#3.2 continue 语句)
    • [3.3 goto 语句](#3.3 goto 语句)
  • 四、综合应用案例
    • [4.1 成绩评级系统(switch优化)](#4.1 成绩评级系统(switch优化))
    • [4.2 素数判断(循环优化)](#4.2 素数判断(循环优化))
    • [4.3 循环效率对比](#4.3 循环效率对比)
  • 五、最佳实践建议

正 文


一、选择结构

根据条件执行不同的代码分支。

1.1 if 语句

1. 基本形式

cpp 复制代码
// 单行格式
if (条件) { 代码块 }

// 多行格式
if (条件) { 代码块 } 
else { 代码块 }

// 多条件格式
if (条件1) { 代码块 }
else if (条件2) { 代码块 }
else { 代码块 }

2. 关键特性

  • 条件表达式应为布尔类型(非零为真,零为假);
  • 代码块若只有单条语句,花括号可省略(但不推荐);
  • 支持多层嵌套;

3. 优化技巧

cpp 复制代码
// 使用逻辑运算符简化条件
if (score >= 90 && score <= 100) {...}

// 避免深层嵌套
if (score < 60) goto fail;
// ... 其他处理
fail: 
    cout << "不及格";

1.2 三目运算符

1. 语法条件 ? 表达式1 : 表达式2

  • 如果表达式1的值为真,执行表达式2,并返回表达式2的结果;
  • 如果表达式1的值为假,执行表达式3,并返回表达式3的结果;

2. 特性

  • 返回表达式结果,可直接赋值;
  • C++中返回的是变量(可继续赋值);
cpp 复制代码
// 找最大值
int max = (a > b) ? a : b;

// 条件赋值
(a > b ? a : b) = 100; // 将较大值设为100

3. 对比 if-else

cpp 复制代码
// 等价于
if (a > b) max = a;
else max = b;

1.3 switch 语句

1. 作用: 执行多条件分支语句;

2. 语法

cpp 复制代码
switch(整型/字符型表达式) {
    case 值1: 代码; break;
    case 值2: 代码; break;
    ...
    default: 代码; break;
}

3. 重要规则

  • case 必须是常量表达式;
  • 必须有 break 防止穿透;
  • default 处理未匹配情况;

4. 优化技巧

cpp 复制代码
// 合并相同处理的case
switch(month) {
    case 1: case 3: case 5: // 31天的月份
        days = 31;
        break;
    case 2: // 特殊处理2月
        days = isLeapYear ? 29 : 28;
        break;
    // ...
}

5. if vs switch

特性 if 语句 switch 语句
条件类型 任意布尔表达式 整型/字符型
区间判断 支持 不支持
执行效率 相对较低 高(跳转表)
代码可读性 简单条件时清晰 多分支时更清晰

二、循环结构

重复执行代码块直到条件不满足。

2.1 while 循环

1. 语法while (条件) { 循环体 }

2. 特点

  • 先判断条件,再执行循环;
  • 适合不确定循环次数的场景;
cpp 复制代码
// 循环打印数字1 ~ 9
while (num < 10)
	{
		cout << num << endl;
		num++;
	}

2.2 do-while 循环

1. 语法do { 循环体 } while (条件)

2. 特点

  • 与while的区别在于它会先执行一次循环语句,在判断循环条件;
  • 至少执行一次循环;
cpp 复制代码
// 输入验证
int input;
do {
    cout << "请输入1-100的数字: ";
    cin >> input;
} while (input < 1 || input > 100);

2.3 for 循环

1. 语法for (初始化; 条件; 更新) { 循环体 }

cpp 复制代码
//for循环,从0到9打印
	for (int i = 1; i <= 100; i++)
	{
		//找特殊数字
		if (i % 7 == 0 || i % 10 == 7 || i / 10 == 7)
		{
			cout << "敲桌子" << endl;
		}
		else
		{
			cout << i << endl;
		}
	}

2. 执行流程

  • 执行初始化语句;
  • 检查条件 → 真则执行循环体;
  • 执行更新语句;
  • 重复步骤2-3;

3. 高级用法

cpp 复制代码
// 多变量初始化
for (int i = 0, j = 10; i < j; i++, j--) {...}

// 范围循环(C++11)
int arr[] = {1,2,3,4,5};
for (int num : arr) {
    cout << num << " ";
}

2.4 嵌套循环

应用场景

  • 多维数据处理;
  • 矩阵运算;
  • 排列组合问题;
cpp 复制代码
// 打印九九乘法表(优化版)
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        // 对齐输出
        cout << j << "×" << i << "=" 
             << setw(2) << i*j << " ";
    }
    cout << endl;
}

三、跳转语句

改变程序执行流程。

3.1 break 语句

1. 作用:立即终止当前循环或switch语句,跳出循环结构。

2. 应用场景

  • switch中防止case穿透;
  • 循环中满足条件时提前退出;
  • 嵌套循环中跳出内层循环;
cpp 复制代码
// 查找数组元素
int arr[] = {2,4,6,8,10};
int target = 8;
for (int i = 0; i < 5; i++) {
    if (arr[i] == target) {
        cout << "找到目标,位置:" << i;
        break;
    }
}

3.2 continue 语句

1. 作用:跳过本次循环剩余代码,进入下一次迭代。

2. 应用场景

  • 过滤特定条件的数据;
  • 跳过无效迭代;
cpp 复制代码
// 打印1-100的奇数
for (int i = 1; i <= 100; i++) {
    if (i % 2 == 0) continue;
    cout << i << " ";
}

3.3 goto 语句

1. 语法goto 标签; ... 标签: 代码

  • 可以无条件跳转语句;
  • 如果标记的名称存在,执行到goto语句时,会跳转到标记的位置;

2. 注意事项

  • 尽量避免使用(降低代码可读性);
  • 适用场景:深层嵌套退出、错误处理;
  • 标签必须在同一函数内;
cpp 复制代码
#include<iostream>
using namespace std;

int main()
{
	//goto语句
	cout << "1、 xxx " << endl;
	cout << "2、 xxx " << endl;
	goto FLAG;
	cout << "3、 xxx " << endl;
	cout << "4、 xxx " << endl;
FLAG:
	cout << "5、 xxx " << endl;
	system("pause");
	return 0;
}

四、综合应用案例

4.1 成绩评级系统(switch优化)

cpp 复制代码
int score;
cout << "请输入成绩(0-100): ";
cin >> score;

switch(score/10) {
    case 10: case 9:
        cout << "优秀"; break;
    case 8:
        cout << "良好"; break;
    case 7:
        cout << "中等"; break;
    case 6:
        cout << "及格"; break;
    default:
        cout << "不及格";
}

4.2 素数判断(循环优化)

cpp 复制代码
bool isPrime(int n) {
    if (n <= 1) return false;
    if (n == 2) return true;
    if (n % 2 == 0) return false;
    
    // 只需检查到sqrt(n)
    for (int i = 3; i * i <= n; i += 2) {
        if (n % i == 0) return false;
    }
    return true;
}

4.3 循环效率对比

循环类型 适用场景 性能特点
for 明确循环次数 最优(编译器易优化)
while 条件驱动循环 中等
do-while 至少执行一次 中等
范围for 遍历容器(C++11) 最优(语法糖)

五、最佳实践建议

1. 循环优化技巧

cpp 复制代码
// 1. 减少循环内计算
int len = array.size(); // 预先计算长度
for (int i = 0; i < len; i++) {...}

// 2. 循环展开
for (int i = 0; i < 100; i += 4) {
    process(i);
    process(i+1);
    process(i+2);
    process(i+3);
}

2. 选择结构原则

  • 简单条件 → if
  • 多离散值 → switch
  • 嵌套超过3层 → 重构为函数

3. 避免常见陷阱

cpp 复制代码
// 陷阱1:赋值=代替比较==
if (x = 5) {...} // 总是真

// 陷阱2:switch忘记break
case 1: cout << "1"; // 会继续执行case2
case 2: cout << "2";

// 陷阱3:浮点数精确比较
double a = 0.1 + 0.2;
if (a == 0.3) {...} // 可能为假

4. 代码可读性提升

cpp 复制代码
// 使用有意义的布尔变量
bool isPassing = (score >= 60);
bool hasPrerequisite = (completedCourses >= 3);

if (isPassing && hasPrerequisite) {
    enrollCourse();
}

流程图解:

复制代码
顺序结构:A → B → C
选择结构:A → [条件] → 真 → B
                |   → 假 → C

循环结构:A → [条件] → 真 → B → 返回检查
                |   → 假 → C

结 束 语


能够看到这里的观众老爷,无疑是对up的最大肯定和支持,在此恳求各位观众老爷能够多多点赞、收藏和关注。在这个合集中,未来将持续给大家分享关于C++的多种常见开发实用操作。未来也将继续分享各种实用干货。感谢大家支持!

相关推荐
charlie11451419127 分钟前
深入理解Qt的SetWindowsFlags函数
开发语言·c++·qt·原理分析
呜喵王阿尔萨斯33 分钟前
编程中的英语
c语言·c++
whoarethenext1 小时前
使用 C++/Faiss 加速海量 MFCC 特征的相似性搜索
开发语言·c++·faiss
向阳@向远方3 小时前
第二章 简单程序设计
开发语言·c++·算法
Mr_Xuhhh3 小时前
信号与槽的总结
java·开发语言·数据库·c++·qt·系统架构
liulilittle3 小时前
VGW 虚拟网关用户手册 (PPP PRIVATE NETWORK 基础设施)
开发语言·网络·c++·网关·智能路由器·路由器·通信
ruanjiananquan994 小时前
c,c++语言的栈内存、堆内存及任意读写内存
java·c语言·c++
持梦远方5 小时前
C 语言基础入门:基本数据类型与运算符详解
c语言·开发语言·c++
江理不变情5 小时前
图像质量对比感悟
c++·人工智能
apocelipes6 小时前
记一次ADL导致的C++代码编译错误
c++·开发工具和环境