循环
1. While语句
【While语句】 While(表达式) 语句
- 圆括号内的表达式是控制表达式,圆括号后面的语句是循环体。
- 先判断控制表达式的值,不为0执行循环体,接着再次判断表达式。直到控制表达式的值为0时停止。
无限循环
如果控制表达式的值始终非零,while语句将无法终止。
2. do语句
【do语句】 do语句 while(表达式)
- 和处理while语句一样,do语句的循环体也必须是一条语句,并且控制表达式的外面也必须有圆括号。
- 执行do语句时,先执行循环体,再计算控制表达式的值。如果表达式的值为非0的,那么再次执行循环体,然后再次计算表达式的值。在循环体执行后,若控制表达式的值变为0,则终止do语句的执行。
- 无论需要与否,最好给所有的do语句都加上花括号。
Notice
- do语句和While语句往往难以区别。这两种语句的区别是,do语句的循环体至少要执行一次,而while语句在控制表达式初始值为0时会完全跳过循环体。
3. for语句
3.1 for语句的定义
【for语句】 for(表达式1;表达式2;表达式3) 语句
- 执行顺序:表达式1只执行一次,用来初始化,然后判断表达式2,满足则执行语句,然后执行表达式3,然后接着判断表达式2,如果表达式2的值不为0,则循环就不会终止,表达式2的值为0,则会跳出循环。
- 简单来说,表达式1-表达式2-语句-表达式3-表达式2-语句-表达式3……
可以用等价的While语句来替换
表达式1;
while(表达式2){
语句
表达式3;
}
3.2 在for语句中省略表达式
for语句远比目前看到的更加灵活。通常for语句用三个表达式控制循环,但是有一些for循环可能不需要这么多,因此C语言允许省略任意或全部的表达式。
- 如果省略第一个表达式,那么在执行循环前要有初始化的操作
i = 10;
for(;i>0;--i)
printf("T minus %d and counting\n",i);
- 如果省略第三个表达式,循环体需要确保第二个表达式的值最终会变为假。
for(i = 10;i > 0;)
printf("T minus %d and counting\n",i--);
- 如果省略第二个表达式,那么它默认为真值,因此for语句不会终止(除非以某种其他形式停止)。
for( ; ; )……
3.3 C99中的for语句
在C99中,for语句的第一个表达式可以替换为一个声明,这一特性使得程序员可以声明一个用于循环的变量;
for(int i = 0;i < n;i++)
……
- 变量i不需要在该语句前进行声明。事实上,如果变量i在之前已经进行了声明,这个语句将创建一个新的 i 且该值仅用于循环内。
- for语句声明的变量不可以在循环外访问(在循环外不可见)。
- for语句可以声明多个变量,只要他们的类型相同。
4. 逗号运算符
【逗号表达式】: 表达式1,表达式2
-
这里的表达式1和表达式2是两个任意的表达式。逗号表达式的计算要通过两步来实现。
-
第一步,计算表达式1并且扔掉计算出的值;第二步,计算表达式2,把这个值作为整个表达式的值。对表达式1的计算应该始终会有副作用;如果没有,那么表达式1就没有了存在的意义。
-
逗号表达式的优先级低于所有其他运算符。
-
逗号运算符是左结合的。
5. 退出循环
我们有些时候需要在循环中间设置退出点,甚至可能需要对循环设置多个退出点。
5.1 break
- break语句还可以用于跳出while,do或者for循环。
- break语句对于退出在循环体中间而不是循环体之前或者之后的情况,break语句特别有用。读入用户输入并且在遇到特殊输入值时终止循环通常属于这种类型。
- break语句把程序控制从包含该语句的最内层while,do,for或switch语句中转移出来。因此,当这些语句出现嵌套时,break语句只能跳出一层嵌套。
思考一下以下例子
while(……){
switch(……) {
……
break;
……
}
}
- break语句可以把程序控制从switch语句中转移出来,但是不能跳出while循环。
5.2 continue
continue语句其实不应该放在这里,因为它无法跳出循环。但由于它和break类似,所以在此介绍。
- break语句会使程序转移到循环末尾之后,而continue语句会把程序留在循环体内。
- break语句可以用于Switch语句和循环(while,do和for),而continue语句只能用于循环
5.3 goto
break语句和continue语句都是跳转语句;他们把控制从程序中的另一个位置转移到另一个位置。这两者都是受限制的;goto语句则可以跳转到函数中任何有标号的语句处(C99增加了一条限制:goto语句不可以用于绕过变长数组的声明)。
- 【标号语句】: 标识符:语句
- 标号只是放置在语句开始处的标识符
- 一条语句可以有多个标号。
- 【goto语句】: goto 标识符;
- 执行语句 goto L;控制会转移到标号L后面的语句上,而且该语句必须和goto语句在同一个函数中。
Notice:
goto语句在早期编程语言很常见,但在日常C语言编程中已经很少用到它了。break、continue、return语句(本质上都是受限的goto语句)足以应付在其他编程语言中需要goto语句的大多数情况。虽然如此,但goto毕竟是goto,比如考虑从包含switch语句的循环中退出的问题。正如前面看到的那样,break语句不会产生期望的结果:它可以跳出Switch语句,但是无法跳出循环。goto语句解决了这个问题。
while(……) {
switch(……) {
……
goto loop_done;
……
}
}
loop_done:……
- goto语句对于嵌套循环的退出也是很有用的。
6. 空语句
语句可以为空,也就是除了末尾处的分号以外什么也没有。
- 实例在P91《现代程序设计》。
0 条评论