第 8 讲:for 循环
for
语句的标准写法
变量循环其实就是 while
和 do-while
语句的一种特别写法,为了方便人的理解,才创立的这样的循环操作,它是 while
的语法糖。
写法是这样的:
for
的括号里有三个语句,并且分别使用分号分开。原因在于它的写法会被编译为 while
语句,所以其实这些语句在 while
之中也都是需要加分号的,所以用分号隔开。两个分号把括号内的内容分隔成了三个部分,按顺序分别叫做初始值、条件、增量,即按变量来看的初始情况值,变量作循环需要满足的条件(或叫每做完一次循环后的判断条件),和每一次循环完成后变量需要变化的量。
它的解释是这样的:先赋初始值、然后判断条件、条件成立时执行循环里面的操作、然后对变量增加增量、然后判断条件、然后条件成立时只需循环里面的操作、然后对变量增加增量、然后判断条件,这样的操作。
比如上面的写法就是这样的:
sum = 0
语句还可以直接写在 for
for
残缺 for
for
循环的分号内的东西可有可无,比如不需要的时候就可以不写,不过呢,分号不能省略。
这样和上面的语句是等价的。毕竟赋初值可以在前面写,也可以后面写。
还可以这样:
这样还是等效的。
带有逗号表达式的 for
在说这一点前,就不得不讲一个东西:逗号表达式。
逗号表达式
逗号表达式发明出来的唯一用途就只是放在 for
里,因为 for
需要用分号分隔所有部分(初值、条件和增量),所以如果想要同时给多个变量赋初始值的时候,或者是给多个变量设定增量的时候,就可以使用它,而不影响分号。
但是,因为它是在 C 语言里存在的语法点,所以也可以使用在其他场合,虽然这一点并不多大意义。
在赋值操作后,a = 3 * 5, a * 4
就是一个逗号表达式。它由两个部分构成:a = 3 * 5
和 a * 4
。逗号表达式的计算是放在所有操作都执行完了才会执行的地方,这里是因为它有括号,所以会执行。
运算法则是这样的,从左到右依次计算,逗号表达式里面每一个用逗号分开的部分都会计算一次,并取最后一个部分,作为整体表达式的数值。比如这里,从左至右,先让 a
获得一个数值是 15,然后计算 a * 4
,得到 60,这个 60 就是整体表达式的数值,最后赋值给 b
,所以 a = 15
、b = 60
。
不过,由于它最后才会被计算,所以如果没有括号的话,就得小心了。
答案竟然是 231
!你敢信?我们来看看为什么。
首先,C 语言规定,它的计算顺序是放在最后的,换句话说,赋值啥的所有操作全部在它前面。所以赋值会被先执行,也就是这句话等于是以下三句话的简写:
只是合并了而已。而这句话你也看得出,逗号表达式虽然要取出最后一个逗号部分作为表达式的数值,但因为运算的关系,a++
已经先被赋值给 c
了,所以最终逗号表达式整体数值结果其实并没有什么用途,故这里其实只是相当于合并书写的一种操作罢了。
那么,c = a++
得到 c
的值应为 1,因为 ++
在后。而 a
最终是会变为 2 的。然后 b
则会因为后面两句话,而增大两个单位。所以 b
应为 3。所以 a = 2、b = 3、c = 1。
逗号表达式嵌套到 for
知道这一点之后,我们来看怎么嵌套。
我们知道,为 1 到 100 求和时,除了为作为循环的变量 i
赋值外,还需要为 sum
给定初始值,否则 sum
从一个根本就不知道是多少的数开始增加,是错误的。
所以我们可以这么写:
当然了,简化写法:
也是 OK 的。注意,这次 for
因为没有大括号的关系,循环的部分就只有 for
带上这个小括号这一部分而已。所以加上了分号,表示它在这里截断,for
的语句只能到这里。
为什么经常把 for
里用的变量命名为 i
?
这是一个很好的问题。你记住一点,它诞生自人们的习惯。之前就说过,变量名称只会受到标识符命名规则的约束,所以取名这一点才是关键。我们最初经常使用到 int
类型来表示整数,除非万不得已才会调整类型。而在 for
循环里,我们常常使用 int
类型的变量作为循环的成员。而这个变量一般表示循环的量,所以它不太好取名。为了简单化处理,我们一般使用它的类型名称的首字母就直接作为了这个变量的名字。比如这里的 int
变量就直接叫做 i
。包括后续会介绍到的嵌套循环,那么里面的变量就叫做 j
,按着顺序排下来,从 i
开始,i
、j
、k
、……。
当然,如果是一个字符类型的变量作为初始变量,那么一般就叫做 c
或者 ch
,其它的变量按类型取名也都是一样的规则。