C語言之 分支語句與迴圈語句粗見
今天讓我們走進C語言中的兩個基本語句的世界中,C語言呢,一共有兩大種語句,即分支語句和迴圈語句,他們的身影幾乎遍插整個程式設計界,是最最基本的語法知識。所以不可小看他們!接下來先看看分支語句:
分支語句(選擇語句)
分支語句又稱選擇語句,那麼先看看語句是什麼?
語句:以分號(;)結尾的一條命令列程式碼,例如:int i = 0 ;
知道了語句,那麼現在我們來看看分支語句分為哪幾類:分支語句有兩類
if 語句
switch語句
舉個 if 語句的例子:
if (1 == i) { printf("you will have good offers!\n"); } else if (2 == i) { printf("you maybe have no good offers!\n"); } else if (3 == i) { printf("good bye!\n"); } else { ; }
由上面的例子我們可以總結一下關鍵點:
1 一組 { } 的程式碼叫做:程式碼塊 (上面一共4個程式碼塊)
2 if ( 表示式 ) 計算機會判斷表示式是否為真,為真的話(即非0)則執行緊接著它下面的程式碼塊語句,為假的話(即 0)則跳過當前 if 語句,去判斷下一條語句。注意啦:我們可以看到上面 if () 語句中,我把數字放在 == 前面,這是個很棒的做法,因為這樣就可以防止我們把 == 寫成了 = ,一旦我們寫錯了,編譯器就立刻會報錯,提示我們去除錯程式碼。(有沒有很機智~嘿嘿)
3 分支語句可以巢狀使用
4 分支語句有單分支語句和多分支語句,上面的例子就是多分支語句。(提一下:單分支語句就是隻有一個 if 語句 和 一個else 語句組合使用)。
5 格外注意:else 語句與離它最近的一個 if 語句匹配。
6 語句可以為空,即一行語句可以只寫一個分號 ' ;' 。
舉個switch多分支語句例子:
#include <stdio.h> int main() { int day = 0; switch(day) { case 1: printf("星期一\n"); break; case 2: printf("星期二\n"); break; case 3: printf("星期三\n"); break; case 4: printf("星期四\n"); break; case 5: printf("星期五\n"); break; case 6: printf("星期六\n"); break; case 7: printf("星期天\n"); break; default: break; } return 0; }
需要注意的幾個關鍵點:
1 每一條case語句最後都要記住帶上 break; 否則程式就會按順序往下執行,帶來意想不到的後果。
2 在switch語句的最後,必須要帶上 default 語句,這是一個好習慣!!!
3 switch語句還有一種寫法,如下:
我們的需求是:如果輸入1-5 則輸出"weekday" , 如果輸入6-7 則輸出"weekend" 。
#include <stdio.h>
#include <windows.h>
int main
{
int day = 2;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default:
break;
}
system("pause");
return 0;
}
上面這個例子,用if語句相比,提高了效率。一看就應該能感覺得到吧~
聊完分支語句,那麼現在我們來聊聊迴圈語句,其實很簡單:迴圈語句有三種(其實有第四種,只是強烈建議慎用!!!待會下面我們會談到,這裡先賣個關子~):
while () 語句
for () 語句
do
while () ; (這裡有分號,別忘了!!!)
我們先來看看while()語句:
#include <stdio.h>
#include <windows.h>
int main()
{
int i = 0;//初始條件
while (i < 10)//判斷條件
{
printf("hello bit!\n");
i++;//更新條件
}
system("pause");
return 0;
}
上面的例子我們已經知道了while迴圈語句的用法,下面我們來看看while迴圈語句中的break 和 continue
break
#include <stdio.h>
#include <windows.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i = i + 1;
}
system("pause");
return 0;
}
輸出結果應該為:1 2 3 4
其實在迴圈中只要遇到break,就停止後期的所有的迴圈,直接終止迴圈。 所以:while中的break是用於永久終止迴圈的。
continue
#include <stdio.h>
#include <windows.h>
int main()
{
int i = 1;
while (i <= 10)
{
i = i + 1
if (i == 5)
continue;
printf("%d ", i);
//i = i + 1;//放到這裡的話就是死迴圈,因為i沒有改變
}
system("pause");
return 0;
}
continue是用於終止本次迴圈的,也就是本次迴圈中continue後邊的程式碼不會再執行,而是直接跳轉到while語句的判斷部分。進行下一次迴圈的入口判斷。
現在我們來看看for迴圈語句:
for(表示式1;表示式2;表示式3)
{
迴圈語句;}
表示式1 表示式1為初始化部分,用於初始化迴圈變數的。 表示式2 表示式2為條件判斷部分,用於判斷迴圈時候終
止。 表示式3 表示式3為調整部分,用於迴圈條件的調整。
可以發現在while迴圈中依然存在迴圈的三個必須條件,但是由於風格的問題使得三個部分很可能偏離較遠,這樣
查詢修改就不夠集中和方便。所以,for迴圈的風格更勝一籌。 for迴圈使用的頻率也最高。
break在for迴圈中
#include <stdio.h>
#include <windows.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
system("pause");
return 0;
}
continue在for迴圈中
#include <stdio.h>
#include <windows.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
system("pause");
return 0;
}
一些建議:
1. 不可在for 迴圈體內修改迴圈變數,防止 for 迴圈失去控制。
2. 建議for語句的迴圈控制變數的取值採用“半開半閉區間”寫法。
for迴圈的變種1
#include <stdio.h>
#include <windows.h>
int main()
{
//變種1
for (;;)
{
printf("hehe\n");
}
system("pause");
return 0;
}
結果是死迴圈
for迴圈的變種2
#include <stdio.h>
#include <windows.h>
int main()
{
int x, y;
for (x = 0, y = 0; x<2, y<5; ++x, y++)
{
printf("hehe\n");
}
system("pause");
return 0;
}
逗號表示式,從左到有依次運算,但是依照最後一個表示式為準!!!
do語句的特點
迴圈至少執行一次,使用的場景有限,所以不是經常使用
#include <stdio.h>
#include <windows.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);
} while (i<10);
system("pause");
return 0;
}
goto語句
C語言中提供了可以隨意濫用的 goto語句和標記跳轉的標號。
從理論上 goto語句是沒有必要的, 實踐中沒有goto語句也可以很容易的寫出程式碼。
但是某些場合下goto語句還是用得著的, 最常見的用法就是終止程式在某些深度巢狀的結構的處理過程, 例如一次跳出兩層或多層迴圈。這種情況使用break是達不到目的的。 它只能從最內層迴圈退出到上一層的迴圈。
關機的例子
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");
while(1)
{
printf("電腦將在1分鐘內關機,如果輸入:我是豬,就取消關機!\n請輸入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是豬"))
{
system("shutdown -a");
break;
}
}
return 0;
}
goto語言真正適合的場景如下:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 處理錯誤情況