当前位置: 首页 > news >正文

C++中的无限循环

C++中的无限循环

while、 do…while 和 for 循环都包含一个条件表达式,在它为 false 时循环结束。如果您指定的条件总是为 true,循环就不会结束。
无限 while 循环类似于下面这样:

while(true) // while expression fixed to true
{DoSomethingRepeatedly;
}

无限 do…while 循环类似于下面这样:

do
{DoSomethingRepeatedly;
} while(true); // do… while expression never evaluates to false

而无限 for 循环类似于下面这样:

for (;;) // no condition supplied = unending for
{DoSomethingRepeatedly;
}

这种循环看似奇怪,但确实有用武之地。假设操作系统需要不断检查 USB 端口是否连接了设备,只要操作系统在运行,这种活动就不应停止。在这种情况下,就应使用永不结束的循环。这种循环也叫无限循环,因为它们将不断执行下去,直到永远。

小心分号

通过在 while 循环的第一行之后意外地放置一个分号也可以创建无限循环,示例如下:

int count = 1;
while (count <= 5) ; //该分号是一个错误
{cout << "Hello ";count = count + 1;
}

因为编译器在发现开始语句块的大括号之前看见了第一行末尾的分号,所以它会在分号的位置结束循环。尤其是它会将分号前面丢失的语句解释为空语句,也就是什么都不做的语句,然后将 while 语句和它后面的任何内容断开。

对于编译器来说,整个循环看起来就像下面这样:

while(count<= 5);

这个 while 循环将持续执行空语句,当然它永远不会执行任何操作。该程序似乎“陷入迷惘”,因为没有任何屏幕输出,也不会显示任何活动。

不要忘记大括号

在编写循环语句时,如果有条件执行的语句是一个语句块,则不要忘记将所有的语句都包含在一组大括号中。如果大括号意外被忽略,则 while 语句有条件执行的仅仅是下一个语句,请看下面的代码示例:

int count = 1;
//该循环忘记使用大括号
while (count <= 5)cout << "Hello ";count = count + 1;

在这段代码中,只有一个语句,也就是 cout 语句,是在 while 循环的主体中。给变量 count 加 1 的语句不在循环体内,所以 count 的值保持为 1,循环测试条件永远为 true。循环将一遍又一遍地打印“Hello”字符串,直到用户停止程序。

不要混清 == 与 =

循环的另一个常见陷阱是,在打算使用 == 运算符时,却意外地使用了 = 运算符。例如,以下示例就是一个无限循环,因为作为循环条件的测试表达式每次都给 remainder 赋值为 1,而不是测试 remainder 是否等于 1:

while (remainder = 1) //错误:条件表达式为赋值语句
{cout << "Enter a number: ";cin >> num;remainder = num % 2;
}

请记住,任何非零值都将被判断为 true。

除了外观形式,do-while 循环和 while 循环之间的区别是 do-while 是一个后测试循环,这意味着在循环结束时,也就是在每次迭代完成后,才测试其表达式。因此,即使测试表达式在开始时为 false,do-while 也至少要执行一次迭代。

例如,在以下 while 循环中,cout 语句根本不会执行:

int x = 1;
while (x < 0)cout << x << endl;

但是在以下 do-while 循环中的 cout 语句将执行一次,因为 do-while 循环在迭代结束之前不会判断表达式 x<0:

int x = 1;
docout << x << endl;
while (x < 0);

如果要确保循环执行至少一次,则应使用 do-while 循环。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程

http://www.lryc.cn/news/159939.html

相关文章:

  • Spark2x原理剖析(二)
  • tomcat安装、部署JSPGOU项目、Tomcat多实例
  • 257. 二叉树的所有路径
  • windows10使用wheel安装tensorflow2.13.0/2.10.0
  • sql-gen:点击生成SQL、RO、VO的工具
  • pytorch从0开始安装
  • Java 语言实现最小生成树算法(如Prim算法、Kruskal算法)
  • 什么是Linux的Overcommit和OOM
  • 解决防火墙导致虚拟机不能ping通宿主机的问题
  • 数据结构:线性表(栈的实现)
  • python如何将一个dataframe快速写入clickhouse
  • Tiny Player Mac:小而美,音乐播放的极致体验
  • 2022年12月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • C语言学习:7、break与continue的用法
  • Ubuntu中安装clion并把clion添加到桌面快捷方式
  • 如何利用python来提取SQL语句中的表名称
  • linux通用时钟框架(CCF)
  • 基于AERMOD模型在大气环境影响评价中的实践技术应用
  • 企业内训课程、在线教育平台付费课程加密防下载的10种方式
  • 公关世界杂志公关世界杂志社公关世界编辑部2023年第14期目录
  • Linux常用(实用)命令大全
  • 2023-09-07力扣每日一题
  • 从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
  • 适用于Linux的Windows子系统(系统安装步骤)
  • HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(二)并行识别
  • 如何使用GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图
  • Blender中的高级边缘控制和纹理映射
  • 从0开始学go第四天
  • 【飞书ChatGPT机器人】飞书接入ChatGPT,打造智能问答助手
  • vue3集成jsoneditor