3.流程控制-循环结构.md 6.9 KB
Newer Older
极客江南's avatar
极客江南 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
## 循环结构

- C语言中提供了三大循环结构, 分别是while、dowhile和for
- 循环结构是程序中一种很重要的结构。
  + 其特点是,在给定条件成立时,反复执行某程序段, 直到条件不成立为止。  
  + 给定的条件称为"循环条件",反复执行的程序段称为"循环体"
    ![](https://img-blog.csdnimg.cn/img_convert/d32037b3b82185eadb8c1f2ae4e2d160.png)

## 循环结构while

- 格式:

```c
while (  循环控制条件 ) {
    循环体中的语句;
    能够让循环结束的语句;
    ....
}
```

- 构成循环结构的几个条件
  - 循环控制条件
    + 循环退出的主要依据,来控制循环到底什么时候退出
  - 循环体
    + 循环的过程中重复执行的代码段
  - 能够让循环结束的语句(递增、递减、真、假等)
    + 能够让循环条件为假的依据,否则退出循环

- 示例:

```c
int count = 0;
while (count < 3) { // 循环控制条件
    printf("发射子弹~哔哔哔哔\n"); // 需要反复执行的语句
    count++; // 能够让循环结束的语句
}
```

- while循环执行流程
  + 首先会判定"循环控制条件"是否为真, 如果为假直接跳到循环语句后面
  + 如果"循环控制条件"为真, 执行一次循环体, 然后再次判断"循环控制条件"是否为真, 为真继续执行循环体,为假跳出循环
  + 重复以上操作, 直到"循环控制条件"为假为止

```c
#include <stdio.h>
int main(){
    int count = 4;
    // 1.判断循环控制条件是否为真,此时为假所以跳过循环语句
    while (count < 3) { 
        printf("发射子弹~哔哔哔哔\n"); 
        count++; 
    }
    // 2.执行循环语句后面的代码, 打印"循环执行完毕"
    printf("循环执行完毕\n");
}
```

```c
#include <stdio.h>
int main(){
    int count = 0;
    // 1.判断循环控制条件是否为真,此时0 < 3为真
    // 4.再次判断循环控制条件是否为真,此时1 < 3为真
    // 7.再次判断循环控制条件是否为真,此时2 < 3为真
    // 10.再次判断循环控制条件是否为真,此时3 < 3为假, 跳过循环语句
    while (count < 3) { 
        // 2.执行循环体中的代码, 打印"发子弹"
        // 5.执行循环体中的代码, 打印"发子弹"
        // 8.执行循环体中的代码, 打印"发子弹"
        printf("发射子弹~哔哔哔哔\n"); 
        // 3.执行"能够让循环结束的语句" count = 1
        // 6.执行"能够让循环结束的语句" count = 2
        // 9.执行"能够让循环结束的语句" count = 3
        count++; 
    }
    // 11.执行循环语句后面的代码, 打印"循环执行完毕"
    printf("循环执行完毕\n");
}
```

---

- ***while循环注意点***
  - 任何数值都有真假性

```c
#include <stdio.h>
int main(){
    while (1) { // 死循环
         printf("发射子弹~哔哔哔哔\n");
         // 没有能够让循环结束的语句
    }
}
```

- 当while后面只有一条语句时,while后面的大括号可以省略

```c
#include <stdio.h>
int main(){
    while (1)  // 死循环
         printf("发射子弹~哔哔哔哔\n");
         // 没有能够让循环结束的语句
}
```

- 如果while省略了大括号, 那么后面不能定义变量

```c
#include <stdio.h>
int main(){
    while (1)  // 死循环
         int num = 10; // 报错
         // 没有能够让循环结束的语句
}
```

- C语言中分号(;)也是一条语句, 称之为空语句

```c
#include <stdio.h>
int main(){
    int count = 0;
    while (count < 3);{ // 死循环
       printf("发射子弹~哔哔哔哔\n"); 
       count++; 
    }
}
```

- 最简单的死循环

```c
// 死循环一般在操作系统级别的应用程序会比较多, 日常开发中很少用
while (1);
```

---

- while练习
  + 计算1 + 2 + 3 + ...n的和
  + 获取1~100之间 7的倍数的个数

---

## 循环结构do while

- 格式:

```c
do {
    循环体中的语句;
    能够让循环结束的语句;
    ....
} while (循环控制条件 );
```

- 示例

```c
int count = 0;
do {
   printf("发射子弹~哔哔哔哔\n");
   count++;
}while(count < 10);
```

- do-while循环执行流程
  + 首先不管while中的条件是否成立, 都会执行一次"循环体"
  + 执行完一次循环体,接着再次判断while中的条件是否为真, 为真继续执行循环体,为假跳出循环
  + 重复以上操作, 直到"循环控制条件"为假为止

- 应用场景
  + 口令校验

```c
#include<stdio.h>
int main()
{
    int num = -1;
    do{
        printf("请输入密码,验证您的身份\n");
        scanf("%d", &num);
    }while(123456 != num);
    printf("主人,您终于回来了\n");
}
```

- while和dowhile应用场景
  + 绝大多数情况下while和dowhile可以互换, 所以能用while就用while
  + 无论如何都需要先执行一次循环体的情况, 才使用dowhile
  + do while 曾一度提议废除,但是他在输入性检查方面还是有点用的

---

## 循环结构for

- 格式:

```c
for(初始化表达式;循环条件表达式;循环后的操作表达式) {
    循环体中的语句;
}
```

- 示例

```c
for(int i = 0; i < 10; i++){
    printf("发射子弹~哔哔哔哔\n");
}
```

- for循环执行流程
  + 首先执行"初始化表达式",而且在整个循环过程中,***只会执行一次***初始化表达式
  + 接着判断"循环条件表达式"是否为真,为真执行循环体中的语句
  + 循环体执行完毕后,接下来会执行"循环后的操作表达式",然后再次判断条件是否为真,为真继续执行循环体,为假跳出循环
  + 重复上述过程,直到条件不成立就结束for循环

- for循环注意点:
  + 和while一模一样
  + 最简单的死循环```for(;;);```

- for和while应用场景
  + while能做的for都能做, 所以企业开发中能用for就用for, 因为for更为灵活
  + 而且对比while来说for更节约内存空间

```c
int count = 0; // 初始化表达式
while (count < 10) { // 条件表达式
      printf("发射子弹~哔哔哔哔 %i\n", count);
      count++; // 循环后增量表达式
}
// 如果初始化表达式的值, 需要在循环之后使用, 那么就用while
printf("count = %i\n", count);
```

```c
// 注意: 在for循环初始化表达式中定义的变量, 只能在for循环后面的{}中访问
// 所以: 如果初始化表达式的值, 不需要在循环之后使用, 那么就用for
// 因为如果初始化表达式的值, 在循环之后就不需要使用了 , 那么用while会导致性能问题
for (int count = 0; count < 10; count++) {
     printf("发射子弹~哔哔哔哔 %i\n", count);
}
//     printf("count = %i\n", count);
```

```c
// 如果需要使用初始化表达式的值, 也可以将初始化表达式写到外面
int count = 0;
for (; count < 10; count++) {
     printf("发射子弹~哔哔哔哔\n", count);
}
printf("count = %i\n", count);
```



最后,如果你有任何疑问,请关注微信公众号 **代码情缘** 加我微信。