百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

EasyC++19,C++中的for循环_c++for循环格式

wptr33 2025-09-06 13:56 8 浏览

大家好,我是梁唐。

这是EasyC++系列的第19篇,简单聊聊C++当中的for循环用法。

想要追求更好阅读体验的同学,可以访问github仓库:EasyLeetCode。

for 循环

在编程当中我们经常会遇到需要重复执行的步骤,想要让计算机能够重复执行某些逻辑,就需要使用循环。

在C++当中,循环有三种类型,分别是for循环、while循环和do while循环。其中前两者使用较多,最后一个很少使用。

基础用法

求1 + 2 + 3 + ... + 100的和,使用for循环实现:

int ret = 0;
int i;
for (i = 1; i <= 100; i++) {
    ret += i;
}

这里的i++表示自增操作,是i+=1的简写,也可以写成++i。不过++ii++并不能完全混用,我们将会在之后的内容当中进行阐述。

根据C++ Primer当中的定义,for循环可以分成三个部分。第一个部分是初始化,在这个for循环当中,我们把循环因子i初始化成了1。第二个部分是判断条件,也就是for循环的执行条件,在什么情况下需要执行循环。第三个部分是更新循环因子,比如在这个例子当中,我们当前的i加入了ret之后,自增1变成了下一个将要累加的数。最后一个部分就是花括号当中的执行体,也就是每次循环需要执行的内容。

写成通用形式就是:

for (initialization; test-expression; update-expression) {
    body;
}

初始化、判断条件以及更新因子这三个部分使用分号分隔。如果循环要执行的内容只包含一条语句,花括号也可以不写。不过为了保证全局的代码风格统一,最好还是统一使用花括号。

test-expression决定循环是否结束,因此,在每一次body开始执行之前,都需要进行一次test-expression的判断。当test-expression为true时,才会执行body中的语句。

test-expression并不一定需要是一个bool值,C++会进行强制转换。比如对于int类型,0值会被转换为false,而其他值都会转换成true。如:

int ret = 0;
int i;
for (i = 100; i; i--) {
    ret += i;
}

这段逻辑和上面一样,同样是计算了1到100累加的值。只不过这里我们进行的是倒序相加,循环的执行条件为i >= 0。当i=0时结束,我们的判断条件可以写成i。int型的i会被强制转换成bool型,当i=0时,值为false,循环结束。其中自减符的用法和自增类似。

进阶用法

首先,我们可以将循环因子的声明写入for循环当中:

// version1
int i;
for (i = 0; i < 100; i++) ret += i;

// version2
for (int i = 0; i < 100; i++) ret += i;

这样有两个好处,第一是简化了代码,将i的声明语句写入了for循环当中,可读性也更好。另一点是限定了i这个变量的使用范围,在for循环当中声明的变量,它的作用域也只有for循环,出了循环之后,i这个变量将消失。

不过在一些老旧的编译器(如VC6.0)当中并不会这样,循环当中声明的变量依然会继续存在。

另外initialization; test-expression; update-expression这三条语句都不是必须的,可以根据我们的需要进行省略。

比如for循环所需要的初始化工作之前已经完成,那么就可以省略initialization

int i = 0;
for (; i < 100; i++) ret += i;

比如我们也可以将循环的结束条件放在for循环的body当中,如:

for (int i = 0;; i++) {
    if (i > 100) break;
    ret += i;
}

我们的更新条件同样也可以放在body中:

for (int i = 0; i < 100;) {
    ret += i; 
    i++;
}

甚至,我们可以极端一点,三个条件都省略:

int i = 0;
for (;;) {
    if (i > 100) break;
    ret += i;
    i++;
}

同样,我们更新的条件也不一定只能自增或自减,其他的任何逻辑也都可以。正因此,C++当中的for循环是非常灵活的, 使用得当完全可以代替while循环和do while循环。

不过除非必要,我们还是要尽量遵守代码规范,不要省略条件,这样代码可读性也会更好一些。

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...