以上我们在while
或do/while
循环中使用循环变量,其实使用循环变量最常用的是for
循环这种形式。for
语句的格式为:
for(控制表达式1;控制表达式2;控制表达式3) 语句
如果不考虑语句中包含continue
语句的情况(稍后介绍continue
语句),这个for
循环等价于下列的while
循环:
控制表达式1; while(控制表达式2) { 语句 控制表达式3; }
从这种等价形式来看,控制表达式1和3都可以为空,但控制表达式2是必不可少的,例如,for(;1;){...}
等价于while(1){...}
死循环。C语言规定,如果控制表达式2为空,则当作控制表达式2的值为真,因此,死循环也可以写成for(;;){...}
。
上一节do/while
循环的例子可以改写成for
循环:
int factorial(int n) { int result = 1; int i; for(i = 1; i <= n; ++i) result = result * i; return result; }
其中++i
这个表达式相当于i = i + 1
,++称为前缀自增运算符(Prefix Increment Operator),类似地,--称为前缀自减运算符(Prefix Decrement Operator),--i
相当于i = i - 1
[11]。如果把++i
这个表达式看作一个函数调用,除了传入一个参数返回一个值(等于参数值加1)之外,还产生一个Side Effect,就是把变量i
的值增加了1。
++
和--
运算符也可以用在变量后面,例如i++
和i--
,为了和前缀运算符区别,称为后缀自增运算符(Postfix Increment Operator)和后缀自减运算符(Postfix Decrement Operator)。如果把i++
这个表达式看作一个函数调用,除了传入一个参数返回一个值(就等于参数值)之外,还产生一个Side Effect,就是把变量i
的值增加了1,它和++i
的区别就在于返回值不同。同理,--i
返回减1之后的值,而i--
返回减1之前的值,但这两个表达式都产生同样的Side Effect,就是把变量i
的值减了1。
使用++、--运算符会使程序更加简洁,但也会影响程序的易读性,[K&R]中的例子大量运用++、--和其它表达式的组合使得代码非常简洁。为了让初学者循序渐进,本书第一部分暂不采用那种风格,++、--运算符总是单独组成一个表达式而不跟其它表达式组合,从本书第二部分开始逐渐采用更简洁的代码风格。
C99引入一种新的for
循环,规定控制表达式1的位置可以有变量定义。例如上例的循环变量i可以只在for
循环中定义:
int factorial(int n) { int result = 1; for(int i = 1; i <= n; i++) result = result * i; return result; }
如果这样定义,那么变量i只是for
循环中的局部变量而不是整个函数的局部变量,相当于“if语句”一节讲过的语句块中的局部变量,因此在循环结束后不能再使用i这个变量了。这个程序用gcc编译要加上选项-std=c99
。在C++中这种写法很常见,但是在C语言中,考虑到兼容性,不建议使用这种写法。
[11] increment和decrement这两个词很有意思,大多数字典都说它们是名词,但经常被当成动词用,在计算机术语中,它们当动词用时应该理解为increase by one和decrease by one。现代英语中很多名词都被当成动词用,字典都跟不上时代了,再比如transition也是如此。