在C語言中,語句可分為以下五類:
?? 1. 表達式語句
?? 2. 函數調用語句
?? 3. 控制語句
?? 4. 復合語句
?? 5. 空語句
而今天我們要探討的就是控制語句里面的分支和循環。
控制語句:控制語句用于控制程序的執行流程,以實現程序的各種結構方式,它們由特定的語句定義符組成,C語言有九種控制語句。可分成以下三類:
?? 條件判斷語句也叫分支語句:if語句、switch語句;
?? 循環執行語句:do while語句、while語句、for語句;
?? 轉向語句:break語句、goto語句、continue語句、return語句。
一、分支語句
?? ?? 流程圖:
?? (1)if
?? ?? 1、概念
if語句:指編程語言中用來判定所給定的條件是否滿足,根據判定的結果(真或假)決定執行給出的兩種操作之一。
?? ?? 2、if的使用方法
?? if(表達式)
語句1
?? if(表達式)
語句1
else
語句2
?? if(表達式)
語句1
else if(表達式)
語句2
else
語句3
(else if的數量無限制)
?? ?? 代碼?? ?? :
include<stdio.h>
int main()
{
int a = 0;
if (a==0)//表達式
{
printf("hehe\n");//語句1
}
else if(a>0)//表達式
{
printf("haha\n");//語句2
}
else
{
printf("GG\n");//語句3
}
return 0;
}
注意?? ??
??(1)懸空else?? ?? :
//如下程序的結果是什么?
include<stdio.h>
int main()
{
int a = 1;
int b = 3;
if (a == 0)
if (b == 3)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
輸出結果為haha,這里要注意else的就近原則,即else會和最近的if進行匹配。不良的代碼風格會造成懸空else,使得程序的可讀性下降,甚至造成誤會。
?? ?? 修改后(代碼?? ?? ):
include<stdio.h>
int main()
{
int a = 1;
int b = 3;
if (a == 0)
{
if (b == 3)
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
??(2)關于判斷條件?? ?? :
include<stdio.h>
int main()
{
int a = 1;
int b = 3;
if (0 == a)
{
if (3 == b)
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
注意?? ??
一般我們將常量寫在等式的左邊,當我們因為疏漏把”==“寫成了”=“時,程序會報錯(因為變量不能進行賦值)。但是當我們將常量寫在等式的右端時,程序不一定會報錯,將常量賦值給變量在計算機看來是沒有問題的。
?? (2)switch
?? ?? 1、概念(+關鍵字)
switch是一種分支語句,常用于多分支的情況。
關鍵字:case、break、default、switch
?? ?? 2、用法
?? (1)switch
switch(整形表達式)
{
語句項;
}
?? (2)case
語句項的內容:
case 整形常量表達式:
語句:
?? (3)break
switch中的break,能幫助我們實現真正的分支。switch語句執行時會從上到下根據括號中表達式的值作比較,當某個case語句中的表達式與此值相同時,就執行這個case語句或語句序列,直到遇到break為止。 break語句是必須有的,它用來結束switch語句的執行。
?? (4)default
當所有case語句后面的表達式都不等于switch語句項中case后面整型常量表達式的值,就執行default后面的默認語句序列。不過,default部分是可選的。如果沒有這一部分,并遇到所有case語句都不匹配,那么,就不作任何處理而進入后續程序段的執行。
?? ?? 例如判斷星期幾,代碼?? ?? :
include<stdio.h>
int main()
{
int day = 1;
switch (day)
{
case 1:
printf("Monday\n");
break;
case 2:
printf("Tuesday\n");
break;
case 3:
printf("Wednesday\n");
break;
case 4:
printf("Thursday\n");
break;
case 5:
printf("Friday\n");
break;
case 6:
printf("Saturday\n");
break;
case 7:
printf("Sunday\n");
break;
default:
break;
}
return 0;
}
注意?? ?? (default)
?? 寫在任何一個 case 標簽可以出現的位置。
?? 當 switch 表達式的值并不匹配所有 case 標簽的值時,這個 default 子句后面的語句就會執行。
?? 所以,每個switch語句中只能出現一條default子句。
?? 但是它可以出現在語句列表的任何位置,而且語句流會像執行一個case標簽一樣執行default子句。
二、循環語句
?? ?? 流程圖:
?? (1)while
?? ?? 概念
while是計算機的一種基本循環模式。當滿足條件時進入循環,進入循環后,當條件不滿足時,跳出循環。while語句的一般表達式為:****while(表達式){循環體}。
?? ?? 代碼?? ?? :
include<stdio.h>
int main()
{
int a = 0;
while (a < 10)
{
//語句內容
a++;
printf("%d\t", a);
}
return 0;
}
?? (2)for
?? ?? 1、概念
for循環:編程語言中一種循環語句,而循環語句由循環體及循環的判定條件兩部分組成。
?? ?? 2、用法
?? for(表達式1; 表達式2; 表達式3)
循環語句;
表達式1:
表達式1為初始化部分,用于初始化循環變量的。
表達式2:
表達式2為條件判斷部分,用于判斷循環時候終止。
表達式3:
表達式3為調整部分,用于循環條件的調整。
?? ?? 代碼?? ?? :
include<stdio.h>
int main()
{
//i可以定義在外面
for (int i = 0; i < 10; i++)
{
printf("%d\t", i);
}
return 0;
}
?? ?? 3、for循環變種:
?? (1)三個表達式都可以省略(初學時不建議省略)?? ??
include<stdio.h>
int main()
{
int i = 0;
for (;;)
{
//死循環
printf("hehe\t");
}
return 0;
}
?? (2)雙重循環(用while也可以實現)?? ??
include<stdio.h>
int main()
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
printf("hehe\t");
}
printf("\n");
}
return 0;
}
?? (3)表達式里面的內容可以不止一條?? ??
include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 0, j = 0; i < 10 && j < 10; i++, j++)
{
printf("hehe\t");
}
return 0;
}
建議:
?? 1. 不可在for 循環體內修改循環變量,防止 for 循環失去控制。
?? 2. 建議for語句的循環控制變量的取值采用“前閉后開區間”寫法。
?? ?? :
for (int i = 0; i < 10; i++)
{}
for (int i = 0; i <= 9; i++)
{}
?? (3)do while
?? ?? 概念
do…while 循環: while 循環的變體。在檢查while()條件是否為真之前,該循環首先會執行一次do{}之內的語句,然后在while()內檢查條件是否為真,如果條件為真的話,就會重復do…while這個循環,直至while()為假。
?? ?? 代碼?? ?? :
include<stdio.h>
int main()
{
int a = 0;
do
{
printf("%d\t", a);
a++;
} while (a < 10);
return 0;
}
總結:
?? 1、區別while和for。
?? ??代碼?? ?? :
include<stdio.h>
int main()
{
int i = 0;
while (i++ < 10)
{
printf("hehe\t");
}
printf("\n");
for (int j = 0; j < 10; j++)
{
printf("hehe\t");
}
printf("\n");
return 0;
}
可以發現在while循環中依然存在循環的三個必須條件,但是由于風格的問題使得三個部分很可能偏離較遠,這樣查找修改就不夠集中和方便。所以,for循環的風格更勝一籌;for循環使用的頻率也最高。
?? ?? 代碼?? ?? :
include<stdio.h>
int main()
{
int i = 0;
while (i++ < 10)
{
printf("%d\t",i);
}
printf("\n");
//輸出結果1、2、3、4、5、6、7、8、9、10
for (int j = 0; j < 10; j++)
{
printf("%d\t", j);
}
printf("\n");
//輸出結果0、1、2、3、4、5、6、7、8、9
return 0;
}
注意?? ??
while和for里面的自增(自減)不同,while里面的自增(自減)會在判斷過后就進行,而for里面的會在本次循環結束后再進行。(曾跌進這個坑里)?? ??
?? 2、區別continue、break、return
continue結束的是本次循環,break結束的是本層循環,而return可以跳出所有循環。
?? ?? 代碼?? ??:
//下面程序的運行結果是什么?
include<stdio.h>
int main()
{
int i = 0;
while (i<10)
{
if (5 == i)
{
continue;
}
printf("%d\t", i);
i++;
}
//結果為0、1、2、3、4后面死循環
return 0;
}
結果為1、2、3、4后面死循環,因為i==5時會進入判斷語句,continue跳出,下面的打印和自增都不會進行,所以i等于5后一直死循環。
?? ?? 代碼?? ?? :
//下面程序的運行結果是什么?
include<stdio.h>
int main()
{
int i = 0;
while (i<10)
{
if (5 == i)
{
break;
}
printf("%d\t", i);
i++;
}
//結果為0、1、2、3、4
return 0;
}
結果為0、1、2、3、4,當i==5時進入判斷,break直接跳出這個循環。當在雙層循環的內層循環里面使用break時,會跳出里面那層循環。
注意?? ??
break、continue用于循環語句,但break還可以用于分支語句的switch。
三、goto語句
?? ?? 概念
goto語句:也可以稱為無條件轉移語句,其一般格式如:goto 語句標號; 其中語句標號是按標識符規定書寫的符號, 放在某一語句行的前面,標號后加半角冒號“:”。語句標號起標識語句的作用,與 goto 語句配合使用。
?? ?? ?? ?? :
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 處理錯誤情況
?? C語言中提供了可以隨意濫用的 goto語句和標記跳轉的標號。
?? 從理論上 goto語句是沒有必要的,實踐中沒有goto語句也可以很容易的寫出代碼。
?? 但是某些場合下goto語句還是用得著的,最常見的用法就是終止程序在某些深度嵌套的結構的處理過程。 例如:一次跳出兩層或多層循環。
?? 多層循環這種情況使用break是達不到目的的。它只能從最內層循環退出到上一層的循環。
?? ?? 代碼(關機程序)?? ?? :
include <stdio.h>
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");
again:
printf("電腦將在1分鐘內關機,如果輸入:
我是豬,就取消關機!\n請輸入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是豬"))
{
system("shutdown -a");
}
else
{
goto again;
}
return 0; }
?? ?? 不使用goto,使用循環?? ?? :
include <stdio.h>
include <stdlib.h>
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; }
浙公網安備 33010602011771號