上期我們介紹了分支語句的兩種句型:if 語句和 switch case語句。 而在c語言中我們經常會需要重復地進行一些指令,但是不斷的編輯重復代碼不僅很繁瑣,還容易出現bug,因此循環語句的使用就非常有必要。今天要介紹的就是循環語句相關的知識。
本期主要介紹三種循環語句
1) while語句
2) do while語句
-
for 語句
-
代碼規范化
- while語句
我們已經掌握了 if 語句
if(條件)
語句;
當條件滿足的情況下,if語句后面的語句執行,否則不執行。這個語句只會執行一次。
但我們發現生活中很多實際的例子是:同一件事情我們需要循環執行多次。
那如何去滿足上述需求呢?c語言中引入了:while語句,可以實現循環。
while語句的語法結構:
while(表達式)
循環語句;
還是使用一個代碼來解釋while循環的執行過程:
#include
int main()
{
int i = 1;
while (i<=10)
{
printf("%d\\n", i);
i++;
}
return 0;
}
通過代碼可以看到,表達式i<=10在i==1的情況下判斷為真,所以循環體中的語句執行,最后打印出1-10,那么我們可以知道,當表達式為真時,while循環才會執行,當表達式為假,循環則不會執行。那么如果表達式是一個非0的數,循環會不會一直執行呢?
#include
int main()
{
while (1)
{
printf("a");
}
return 0;
}
通過運行結果可以看到,當表達式為1時,while循環會一直執行循環體,也就變成了一個死循環。
while循環中的break:
#include
int main()
{
int i = 1;
while (i<=10)
{
printf("%d\\n", i);
if (i==5)
{
break;
}
i++;
}
return 0;
}
通過前面的代碼我們知道這個代碼是用于打印1-10,那么如果在i==5的時候加入break,會發生什么呢?
可以看到當加入了break之后,當執行到i==5時,后面的循環并沒有執行,那么可以理解為break語句的意思是終止循環。
while循環中的continue語句
#include
int main()
{
int i = 1;
while (i<=10)
{
if (i == 5)
{
continue;
}
printf("%d\\n", i);
i++;
}
return 0;
}
上面我們知道了break的作用,那么continue和break有什么區別呢,通過運行結果可以看到,當輸出到4時,代碼進入了一個死循環,而不是像break一樣終止,這是為什么呢?我來解釋一下,continue的意思為繼續,當代碼執行到continue時,會跳過本次循環而繼續下一次,從代碼中看到,當i==5時,循環跳過,那么i++不會執行,i的值就不會改變,那么i==5回到表達式判斷5<10,進入循環,那么這個時候i==5就又會觸發continue,然后i++又不能執行,就造成i的值一直為5,一直跳過,就成了一個死循環。
- do while語句
語法結構:
do {
循環體語句;
} while(條件判斷語句);
執行流程:
①執行初始化語句
②執行循環體語句
③執行條件控制語句
④執行條件判斷語句,看其結果是true還是false
如果是false,循環結束
如果是true,循環繼續執行
⑤回到②繼續
do while語句與while很相似,只不過do while語句是先執行循環體語句后進行條件判斷
此循環語句使用的較其他兩種較少,一般是在一些小游戲(猜數字,三子棋)中使用
- for循環
語法結構:
for (表達式1; 表達式2; 表達式3)
{
語句;
}
首先要強調兩點:
-
表達式1、表達式2和表達式3之間是用分號“ ;”隔開的,千萬不要寫成逗號。
-
for(表達式1;表達式2;表達式3)
的后面千萬不要加分號,很多新手都會犯這種錯誤——會情不自禁地在后面加分號。因為 for 循環只能控制到其后的一條語句,而在C語言中分號也是一個語句——空語句。所以如果在后面加個分號,那么 for 循環就只能控制到這個分號,下面大括號里面的語句就不屬于 for 循環了。
執行流程:
//求解表達式1。
//求解表達式2。若其值為真,則執行 for 語句中指定的內嵌語句,然后執行第3步;若表達式2值為假,則結束循環,轉到第5步。
//求解表達式3。
//轉回上面第2步繼續執行。
//循環結束,執行 for 語句下面的語句。
從這個執行過程中可以看出,“表達式1”只執行一次,循環是在“表達式2”“表達式3”和“內嵌語句”之間進行的。
for循環的最簡單形式:
for (循環變量賦初值; 循環條件; 循環變量增值)
{
語句;
}
下面我們使用for循環寫一個簡單的代碼
例:<求 1+2+3+4+…+100 的總和。>
# include
int main(void)
{
int i;
int sum = 0; //
for (i=1; i<=100; ++i) //++是自加的意思, ++i相當于i = i + 1
{
sum = sum + i; /*等價于sum += i;但是不建議這么寫, 因為sum = sum + i看起來更清楚、更舒服*/
}
printf("sum = %d\\n", sum);
return 0;
}
三種循環的區別:
for循環和while循環先判斷條件是否成立,然后決定是否執行循環體(先判斷后執行)
do…while循環先執行一次循環體,然后判斷條件是否成立,是否繼續執行循環體(先執行后判斷)
- 代碼規范化
1)if、else、for、while、do 都只能控制到其后的一條語句,如果要控制多條語句必須加大括號 {}
。但基于代碼規范化,if、else、for、while、do 后面的執行語句不論有多少行,就算只有一行也要加 {}
。
2)像 if、for、while 等關鍵字之后應留一個空格再跟左括號 (
,以突出關鍵字。
此外上面的程序還有一個知識點要跟大家說一下:從功能上講, for(i=1; i<=100;++i)
完全可以寫成 for(i=1; i<101; ++i)
,而且建議大家盡量使用這種寫法。也就是說,循環語句的循環條件盡量寫成半開半閉的,不管是 for 循環還是 while 循環。
for(i=1; i<101; ++i)
實際上是 1≤i<101,是半開半閉的;而 for(i=1; i<=100; ++i)
實際上是 1≤i≤100,是全閉的。那么為什么建議使用半開半閉的呢?因為如果寫成 i<=100 的話,那么每次判斷的時候都要判斷兩次,即 i<100 和 i==100,而寫成 i<101 的話每次只需要判斷一次。
也許有人說:程序在執行 i<=100 的時候不是將它轉換成 i<100||i==100 嗎?這樣由“短路或”的知識可知,如果前面的為真那么后面的不就不會執行了嗎?這樣不也是判斷一次嗎?不是這樣的,系統是不會將 i<=100 轉換成 i<100||i==100 的,每次判斷的時候 i<100 和 i==100 都要判斷。
但是寫成半開半閉也有一個問題,就是會影響對代碼的理解。有時候寫成全閉的區間理解起來才順暢,而寫成半開半閉反而不易理解,比如 `<=`右邊是變量或表達式的時候。這時候要以可讀性為第一要素,即哪種好理解就使用哪種?,F在 CPU 速度那么快,也不在乎那點效率。所以前面說“盡量”,沒有要求一定要那樣寫。
-
指令
+關注
關注
1文章
607瀏覽量
35710 -
C語言
+關注
關注
180文章
7604瀏覽量
136813 -
代碼
+關注
關注
30文章
4788瀏覽量
68603
發布評論請先 登錄
相關推薦
評論