循环

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《现代程序设计》。
分类: C

易碎

易碎

我看到的今夜的星空,是几万年前的光,我眼中的你是此时的你!

0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注

网站ICP备案皖ICP备2024045222号-1