for语句
本节阅读量:C++中使用最多的循环语句是for语句。当有一个明显的循环变量时,for语句(也称为for循环)是首选,因为它允许我们轻松而简洁地定义、初始化、判断和更改循环变量的值。
从C++11开始,for循环有两种不同形式。本节将介绍经典的for语句。在以后的课程中,介绍完一些其他先决主题(如数组和迭代器)后,我们将介绍新的range-for语句。
for语句在定义上看起来相当简单:
|
|
可以将for循环理解为等价的while语句:
|
|
for语句的计算
for语句分为3阶段执行:
首先,执行初始化语句。它只会在循环开始时执行一次。初始化语句通常用于定义和初始化变量。这里定义的变量具有“循环作用域”,本质上只是块作用域的一种形式;这些变量从定义点开始一直存在到循环语句末尾。在等价的while循环中,可以看到初始化语句位于等价代码块内,当整个代码块结束时,初始化语句中定义的变量就会超出作用域。
其次,对于每次循环迭代,都会先计算条件表达式的结果。如果结果为true,则执行对应的语句。如果结果为false,则循环终止,并执行循环之外的下一条语句。
最后,计算递增/递减表达式。通常,该表达式用于递增或递减初始化语句中定义的循环变量。然后,流程会返回第二步(再次判断条件表达式)。
来看一个示例:
|
|
首先,声明一个名为i的循环变量,并用值1对其进行初始化。
其次,计算i<=10,因为i是1,所以它的计算结果为true。因此,执行语句,输出1和空格。
最后,计算++i,将i增加到2。然后循环返回到第二步。
现在,再次计算i<=10。由于i的值为2,因此它的计算结果为true,因此循环再次迭代。打印2和一个空格,i递增为3。循环继续迭代,直到最终i增加到11,此时i<=10的计算结果为false,循环退出。
因此,该程序打印结果:
|
|
可以将上面的for循环转换为等效的while循环:
|
|
注意,这里需要外部大括号,因为当循环结束时,变量 i 超出了作用域。
对于新程序员来说,for循环可能很难阅读——然而,有经验的程序员通常很喜欢它。它是一种使用计数器进行循环的紧凑写法,并且在语句开头集中提供了循环变量、循环条件和循环变量变化方式等必要信息。这有助于减少错误。
更多for循环示例
下面是使用for循环计算整数的指数示例:
|
|
此函数返回base^exponent(base的exponent次方)。
这是一个简单的for循环,其中i从0循环到(但不包括)exponent。
如果exponent为0,for循环将执行0次,函数将返回1。如果exponent为1,for循环将执行1次,函数将返回1base。如果exponent为2,for循环将执行2次,函数将返回1base*base。
尽管大多数for循环将循环变量增加1,但也可以将其减少:
|
|
结果:
|
|
也可以在每次迭代中让循环变量的变化量大于1:
|
|
结果:
|
|
在for循环条件中使用 != 操作符有些危险
在编写涉及值的循环条件时,通常可以用许多不同的方法编写条件表达式。以下两个循环执行结果相同:
|
|
那么我们应该选择哪一个呢?前者是更好的选择,因为即使i跳过值10,它也会终止,而后者不会。下面的示例演示了这一点:
|
|
最佳实践
for循环条件中进行数值比较时,避免使用 != 。
少迭代一次的错误
对于for循环(以及使用计数器的其他循环),最常见的问题之一是条件表达式写错,导致循环多迭代或少迭代一次。
下面是一个示例:
|
|
原本期望打印12345,但它只打印1234,因为这里使用了错误的关系运算符。
这种错误最常见的原因是使用了错误的关系运算符,但有时也可能是递增或递减操作写错导致的。
省略的表达式
for语句中的任何部分都可省略。例如,在下面的示例中,将省略初始化语句和递增/递减表达式,只保留条件表达式:
|
|
此for循环产生以下结果:
|
|
这里不使用for循环来进行初始化和递增,而是手动完成。本例只是为了演示,但在某些情况下,确实可能不需要声明循环变量(因为已经有了一个),或者不需要在递增/递减表达式中操作循环变量(因为它已经在其他地方被修改)。
值得注意的是,下面的示例生成了无限循环:
|
|
上述示例相当于:
|
|
这可能有点出乎意料,因为您可能以为省略的条件表达式会被视为false。然而,C++标准明确规定,for循环中省略的条件表达式应被视为true。
建议完全避免这种形式的for循环,而是使用while (true)。
具有多个计数器的循环
尽管for循环通常只围绕一个变量迭代,但有时也需要处理多个循环变量。为此,可以在初始化语句中定义多个变量,并使用逗号操作符在递增/递减表达式中修改多个变量的值:
|
|
该循环定义并初始化两个新变量:x和y。它在0到9的作用域内迭代x,每次迭代后x递增,y递减。
该程序生成结果:
|
|
这是C++中少数几个在同一语句中定义多个变量,并且使用逗号运算符通常被认为可以接受的场景。
循环嵌套
与其他类型的循环一样,for循环可以嵌套在其他循环中。在下面的示例中,将for循环嵌套在另一个for循环中:
|
|
对于外部循环的每次迭代,内部循环都会完整地运行。因此,输出为:
|
|
外部循环首先运行,char c被初始化为“a”。然后计算c <= “e”,结果为true,因此执行循环体。由于c被设置为“a”,所以首先打印a。然后,内部循环完整执行(打印0、1和2)。接着打印换行符。之后,外部循环返回顶部,c增加到“b”,并重新计算循环条件。由于循环条件仍然为true,因此开始外部循环的下一次迭代。这将打印b012\n。依此类推。
总结
for语句是C++语言中最常用的循环。尽管它的语法对新程序员来说通常有点混乱,但您会经常看到for循环,并且很快就会理解它们!
如果有明确的计数器,优先使用for语句;否则,while语句可能是更好的选择。