【C++】loop statement and init-statement

最近看C++ Primer,发现了声明语句竟然可以被用在while的condition中,于是稍作整理,得此博文。

一. for与init-statement

大家都知道for循环是完全可以初始化变量的。for的范式如下所示:

for (init-statement; condition; expression) { /* Do something... */ }

其中,我们的init-statement中定义的变量,完全可以带入我for的block中
e.g.

for (int i = 1; i <= 10; ++i) {
	// 输出1~10之间的整数,每一个占一行
	std::cout << i << " ";
}

值得注意的是,for循环中的3个statements执行的顺序:

  1. init-statement只在循环最开始的时候执行一次。
  2. condition在每次循环开始的时候执行。
  3. expression在每次循环结束后执行。

这样就保证了不会出现重复定义的error。
for循环,唯一要讲的就是: for的block中定义的变量,会在本次循环结束后无效;同时,进入下一次循环中(如果有的话)又会被重新定义。

二. while与init-statement

虽然while语句中的condition需要一个值,但是init-statement显然没有返回值(即便有,也没有意义),却仍然可以用在condition中。In other words:

while (int i = 1) { /* Do somethings */ }

这样的语句是合法的。
值得注意的是:当且仅当i被初始化为0时,才不进入循环体。
这个建议大家自己尝试,这里就不放图了。
还有就是condition和init-statement共享一个scope:
在这里插入图片描述当然了,从上图还可以看出——当跳出while的block时,condition中定义的变量生命周期终止。
另外,每次循环结束,condition中定义的变量都会被废弃;但在下一次循环(如果有的话),会被重新声明。

三. do…while与init-statement

直接上结论——do…while不允许在condition使用init-statement;
而且,block和scope并不共享一个scope;

// do...while范式
do {
	/* Do something */
} while (condition);

这就导致了:

  1. block中定义的变量无法在condition中使用,因为两种不是同一个scope;
  2. condition中定义的变量也无法在block中使用。因为根本就不允许定义变量。

所以do…while中的condition中所要用到的变量,只能在do…while块之前声明了。

四. C++ vs C

我之前写的,对于某些专攻C++的人来说,可能过于基础,但是我想说得是,while循环中使用init-statement,只是C++的feature。
在这里插入图片描述可以看我文件的后缀名(.c,而且main的参数也遵循了C中的void)。可以看出C和C++在这基础上表现不同。
至于为什么C++会添加这一种特性,我还不太清楚——存在即合理,希望高人指点。

五. summary

本文总结了loop statement和init-statement之间的关系。最后给出了C与C++之间的一个重要区别。
针对for语句:

  1. 它有专门的init-statement,只初始化一次。
  2. 对于block中初始化的变量,在本次循环结束后无效,但在下一次循环中又被重新声明。

针对while语句:

  1. condition和block共享一个scope。
  2. 但是while没有特定的初始化语句,所以无论在哪里初始化的变量都遵循for中的第二个特性。
  3. 变量初始化为非0值,进入block;为0则不进入block

针对do…while:
由于condition和block不共享同一个scope,故不能(也不合法)在condition中使用init-statement;只能在do…while之前才行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值