
5.2.2 for语句的主要说明
针对for语句,有必要做一些说明。
(1)表达式1可以省略,但其后面的分号(;)不能省略,当表达式1省略时,应该在for语句之前就给循环变量赋初值。当然,这种写法相对比较少见,把上面从1加到100的加法运算范例稍微改造一下:

(2)表达式2可以省略,也就是不判断循环结束条件,但分号依旧不能省略,那么循环就会无终止地进行下去,此时,就必须用break语句终止for循环,break语句后面会讲到。这种写法相对比较少见,继续改造从1加到100的加法运算范例:

(3)表达式3可以省略,但必须想办法保证循环能正常结束,否则循环会无终止地进行下去。这种写法相对也不多见,继续改造从1加到100的加法运算范例:

(4)可以省略表达式1、表达式3,只写表达式2,还是要注意,该保留的分号必须要保留。看改造后的范例:

(5)三个表达式都省略:不设置初值,不判断条件(认为条件一直为真),循环变量值不增加。这会导致无终止地执行循环体。这种写法在一些实际项目中会看到,需要认识一下。看如下代码:

这相当于如下while语句:

这种写法的循环要想终止执行,必须要在for的内嵌语句中,根据一定的条件增加break语句来跳出循环体。范例如下:

(6)表达式1可以用于设置循环变量的初值,也可以是与循环变量无关的其他表达式。范例如下:

(7)表达式1和表达式3都可以是简单表达式或者逗号表达式,不过这种用法比较少见。再次提醒一下:表达式1只被执行一次,但表达式3是循环体执行几次,表达式3就执行几次。范例如下,注意“sum=0,i=1;”作为一个整体被当作表达式1:

(8)表达式2的值一般是关系表达式或者逻辑表达式,但只要其值为非0,就执行循环体,这种用法也比较少见:

总结一下:虽然for语句有各种各样的花哨用法,但建议还是中规中矩地使用,这样也方便他人阅读。最传统的for语句用法就像如下这样:

或者直接把变量i的定义与初始化写在一起,如下(这是C++的写法而非C语言的写法了):
