#### 循環結構之while循環
反復不停的執行某個動作稱之謂循環,C語言中有三種循環結構,先看一下C語言while循環的結構

其中表達式表示循環條件,執行代碼塊為循環體。while語句的語義是:計算表達式的值,當值為真(非0)時, 執行循環體代碼塊。其執行過程可用下圖表示:

代碼

使用while語句應注意以下幾點:
- while語句中的表達式一般是關系表達或邏輯表達式,當表達式的值為假時不執行循環體,反之則循環體一直執行。
- 一定要記著在循環體中改變循環變量的值,否則會出現死循環(無休止的執行)。
- 循環體如果包括有一個以上的語句,則必須用{}括起來,組成復合語句
#### 循環結構之do-while循環 ####
C語言中的do-while循環,一般形式如下:

do-while循環語句的語義是:它先執行循環中的執行代碼塊,然后再判斷while中表達式是否為真,如果為真則繼續循環;如果為假,則終止循環。因此,do-while循環至少要執行一次循環語句。其執行過程可用下圖表示:

代碼

**注意:使用do-while結構語句時,while括號后必須有分號。**
#### 循環結構之for循環(一) ####
在C語言中還有一種更加靈活的循環,它完全可以秒殺前面兩種循環結構,因為它相對前兩種循環結構語法更直接、簡單。它的一般形式為:

**它的執行過程如下:**
* 第一步:執行表達式1,對循環變量做初始化;
* 第二步:判斷表達式2,若其值為真(非0),則執行for循環體中執行代碼塊,然后向下執行;若其值為假(0),則結束循環;
* 第三步:執行表達式3;
* 第四步:執行for循環中執行代碼塊后執行第二步;
* 第五步:循環結束,程序繼續向下執行。
其執行過程可用下圖表示:

例:小明下決心抄10遍computer這個單詞,用for循環實現如下:

**注意:for循環中的分號一定要寫**
#### 循環結構之for循環(二)
在for循環中,表達式1是一個或多個賦值語句,它用來控制變量的初始值;表達式2是一個關系表達式,它決定什么時候退出循環;表達式3是循環變量的步進值,定義控制循環變量每循環一次后按什么方式變化。這三部分之間用分號(;)分開。
**使用for語句應該注意:**
**1、for循環中的“表達式1、2、3”均可可以缺省,但分號(;)不能缺省**
**2、省略“表達式1(循環變量賦初值)”,表示不對循環變量賦初始值。如:**

**3、省略“表達式2(循環條件)”,不做其它處理,循環一直執行(死循環)。如:**

**4、省略“表達式3(循環變量增量)”,不做其他處理,循環一直執行(死循環)。如:**

**注:死循環可以使用后面即將講到的break解決**
**5、表達式1可以是設置循環變量的初值的賦值表達式,也可以是其他表達式。如:**

**6、表達式1和表達式3可以是一個簡單表達式也可以是多個表達式以逗號分割。如:**

運行結果為

**7、表達式2一般是關系表達式或邏輯表達式,但也可是數值表達式或字符表達式,只要其值非零,就執行循環體。**

**8、各表達式中的變量一定要在for循環之前定義。如:**

#### 循環結構之三種循環比較
while、do-while和for三種循環在具體的使用場合上是有區別的,如下:
* 1、在知道循環次數的情況下更適合使用for循環;
* 2、在不知道循環次數的情況下適合使用while或者do-while循環,如果有可能一次都不循環應考慮使用while循環,如果至少循環一次應考慮使用do-while循環。
但是從本質上講,while,do-while和for循環之間是可以相互轉換的,如:小明被老師罰抄10次computer這個單詞,分別用三種語法寫:

#### 循環結構之多重循環
多重循環就是在**循環結構的循環體中又出現循環結構。**
在**實際開發中一般最多用到三層重循環**。因為循環層數越多,運行時間越長,程序越復雜,所以**一般用2-3層多重循環就可以了**。另外不同循環之間也是可以嵌套的。
多重循環在執行的過程中,外層循環為父循環,內層循環為子循環,父循環一次,子循環需要全部執行完,直到跳出循環。父循環再進入下一次,子循環繼續執行...

> 注:一個父循環可以有多個子循環
那么上面這個用“*”輸出的矩形用多重循環實現如下:

雙重循環實現輸出正三角形,效果如下

代碼
#include <stdio.h>
int main()
{
int i, j, k;
for(i=1; i<5; i++)//控制每一行
{
for( j = i ; j < 5 ; j++)
{
printf(" ");//將空格換成其他符號,就可以發現規律
}
for( k = 0 ; k < i * 2 - 1 ; k++ )
{
printf("*");
}
printf("\n");
}
return 0;
}
將空格換成其他符號比如“^”就會發現規律,如下圖輸出結果所示

- 前言
- JNI基礎知識
- C語言知識點總結
- ①基本語法
- ②數據類型
- 枚舉類型
- 自定義類型(類型定義)
- ③格式化輸入輸出
- printf函數
- scanf函數
- 編程規范
- ④變量和常量
- 局部變量和外部變量
- ⑤類型轉換
- ⑥運算符
- ⑦結構語句
- 1、分支結構(選擇語句)
- 2、循環結構
- 退出循環
- break語句
- continue語句
- goto語句
- ⑧函數
- 函數的定義和調用
- 參數
- 函數的返回值
- 遞歸函數
- 零起點學通C語言摘要
- 內部函數和外部函數
- 變量存儲類別
- ⑨數組
- 指針
- 結構體
- 聯合體(共用體)
- 預處理器
- 預處理器的工作原理
- 預處理指令
- 宏定義
- 簡單的宏
- 帶參數的宏
- 預定義宏
- 文件包含
- 條件編譯
- 內存中的數據
- C語言讀文件和寫文件
- JNI知識點總結
- 前情回顧
- JNI規范
- jni開發
- jni開發中常見的錯誤
- JNI實戰演練
- C++(CPP)在Android開發中的應用
- 掘金網友總結的音視頻開發知識
- 音視頻學習一、C 語言入門
- 1.程序結構
- 2. 基本語法
- 3. 數據類型
- 4. 變量
- 5. 常量
- 6. 存儲類型關鍵字
- 7. 運算符
- 8. 判斷
- 9. 循環
- 10. 函數
- 11. 作用域規則
- 12. 數組
- 13. 枚舉
- 14. 指針
- 15. 函數指針與回調函數
- 16. 字符串
- 17. 結構體
- 18. 共用體
- 19. typedef
- 20. 輸入 & 輸出
- 21.文件讀寫
- 22. 預處理器
- 23.頭文件
- 24. 強制類型轉換
- 25. 錯誤處理
- 26. 遞歸
- 27. 可變參數
- 28. 內存管理
- 29. 命令行參數
- 總結
- 音視頻學習二 、C++ 語言入門
- 1. 基本語法
- 2. C++ 關鍵字
- 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. 多線程
- 總結
- 音視頻學習 (三) JNI 從入門到掌握
- 音視頻學習 (四) 交叉編譯動態庫、靜態庫的入門學習
- 音視頻學習 (五) Shell 腳本入門
- 音視頻學習 (六) 一鍵編譯 32/64 位 FFmpeg 4.2.2
- 音視頻學習 (七) 掌握音頻基礎知識并使用 AudioTrack、OpenSL ES 渲染 PCM 數據
- 音視頻學習 (八) 掌握視頻基礎知識并使用 OpenGL ES 2.0 渲染 YUV 數據
- 音視頻學習 (九) 從 0 ~ 1 開發一款 Android 端播放器(支持多協議網絡拉流/本地文件)
- 音視頻學習 (十) 基于 Nginx 搭建(rtmp、http)直播服務器
- 音視頻學習 (十一) Android 端實現 rtmp 推流
- 音視頻學習 (十二) 基于 FFmpeg + OpenSLES 實現音頻萬能播放器
- 音視頻學習 (十三) Android 中通過 FFmpeg 命令對音視頻編輯處理(已開源)