引子
CSP-J真题中,for循环后面括号内的几个表达式组形式特别……
for循环的格式
for (表达式一; 表达式二; 表达式三)
{
循环体;
}
示例代码:循环输出1-100
for (int i = 1; i <= 100; i++)
{
cout << i << " ";
}
for循环的执行顺序
①表达式一(只执行一次) ②表达式二 ③循环体 ④表达式三 ②表达式二 ③循环体 ……
【④-②-③】 不断重复执行,直到②为假。
拆分解释
表达式一:变量初始化表达式
表达式二:执行循环的条件(关系表达式)
表达式三:累加(累减),累计作用
三个表达式一般配合使用,但是特殊情况下,有可能会出现如题比较特别的形式。但是不管何种形式,for
后面的括号内必然是三个表达式,包含空表达式即只有一个分号。两个分号分隔出来三个表达式。
表达式一
如果表达式一中的变量已经在前面定义了,那么表达式一可以空着,就是空表达式,空表达式只有一个分号结尾,但是必须有分号结尾。
如题,表达式一,是一个空表达式。
表达式二
表达式二是一个条件,是一个关系表达式,它的结果是布尔类型,所以只要符合结果是布尔类型的表达式就可以作为表达式二(一个变量加一个分号也组成一个表达式)。
既然表达式二是一个布尔类型,那么根据隐式转换为布尔类型“非零即真”的原则,只要结果为0,就是假,那么结束循环;否则都是真,继续执行循环。
如题,表达式二是一个数值变量n,那么当n的值为0时,结束循环;只要n的值不为0,就继续执行循环体。n的值是根据什么得出的呢,是根据表达式三的计算结果。
表达式三
表达式三是一个累计控制的表达式,可以对循环条件造成影响。
如题通过表达式三算出来n的值,直到结果为0的时候,表达式二就为假,那么就不执行循环了。
总结
除了题目中这样的写法,还有很多变体。
如题这种非常规的写法,日常中极少用到,日常遇到类似的功能,使用while循环或者do-while循环实现就可以。
这些非常规写法,也就是会出现在竞赛类的题目中。所以我们日常中不要这样写,但要明白各种变体表现的是什么意思。