?這篇文章我們詳細的把分支語句和循環語句給大家進行講解。
分支語句:
? if
? switch
循環語句:
? while
? for
? do while
goto語句:
?
1.什么是語句?
C語句可分為以下五類:
1. 表達式語句
2. 函數調用語句
3. 控制語句
4. 復合語句
5. 空語句
大家可以看一下這三個語句。
#define _CRT_SECURE_NO_WARNINGS 1
int main()
{3 + 5;//表達式語句printf("hehe\n");//函數調用語句;//空語句 - 有時候我們需要一條語句,但是這條語句什么都不需要做,就可以使用空語句return 0;
}
我們詳細的講解控制語句,控制語句用于控制程序的執行流程,以實現程序的各種結構方式,它們由特定的語句定義符組成,C語言有九種控制語句。
可分成以下三類:
1. 條件判斷語句也叫分支語句:if語句、switch語句;
2. 循環執行語句:do while語句、while語句、for語句;
3. 轉向語句:break語句、goto語句、continue語句、return語句。
2.分支語句(選擇結構)
如果你好好學習,校招時拿一個好offer,走上人生巔峰。
如果你不學習,畢業等于失業,回家賣紅薯。
這就是選擇!
2.1 if語句
if語句有多分支也有單分支,哪一條語句為真就進去哪一條語句,都為假則進入else語句。
語法結構:
if(表達式)
語句;
if(表達式)
語句1;
else
語句2;
//多分支
if(表達式1)
語句1;
else if(表達式2)
語句2;
else
語句3;
這是單分支:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{//如果年齡大于等于18-成年人int age = 0;scanf("%d", &age);if (age >= 18)printf("成年人\n");return 0;
}
?這是多分支:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{//如果年齡大于等于18-成年人,否則打印-未成年人int age = 0;scanf("%d", &age);if (age >= 18)printf("成年人\n");elseprintf("未成年人\n");return 0;
}
?實例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int age = 0;scanf("%d", &age);if (age < 18){printf("未成年\n");}else if (age >= 18 && age <= 30){printf("青年\n");}else if (age >= 31 && age <= 50){printf("中年\n");}else if (age >= 51 && age <= 70){printf("中老年\n");}else if (age >= 71 && age <= 99){printf("老年\n");}else{printf("老壽星\n");}return 0;
}
我們也可以把&&前的表達式去掉,因為走到這一條語句的時候,上一條語句的表達式一定是假的。大家注意一下,if語句后面默認執行一條表達式。
如果條件成立,要執行多條語句,怎應該使用代碼塊。
#include <stdio.h>
int main()
{
if(表達式)
{
語句列表1;
}
else
{
語句列表2;
}
return 0;
這里的一對 { } 就是一個代碼塊。
2.1.1懸空else
#include <stdio.h>
int main()
{int a = 0;int b = 2;if(a == 1)if(b == 2)printf("hehe\n");elseprintf("haha\n");
return 0;
}
這就是懸空else,這是一種不好的代碼習慣。
改正:
//適當的使用{}可以使代碼的邏輯更加清楚。
//代碼風格很重要
#include <stdio.h>
int main()
{int a = 0;int b = 2;if(a == 1){if(b == 2){printf("hehe\n");}}else{printf("haha\n");}
return 0;
}
?else的匹配:else是和它離的最近的if匹配的。
2.1.2 if書寫形式的對比
//代碼1
if (condition) {
return x;
}
return y;
//代碼2
if(condition)
{
return x;
}
else
{
return y;
}
//代碼3
int num = 1;
if(num == 5)
{
printf("hehe\n");
}
//代碼4
int num = 1;
if(5 == num)
{
printf("hehe\n");
}
代碼2和代碼4更好,邏輯更加清晰,不容易出錯。
2.1.3 練習
1. 判斷一個數是否為奇數
輸入一個整數,如果這個整數%2等于1,就打印YES,這個數就是奇數,否則就不是。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int n = 0;scanf("%d", &n);if (n % 2 == 1)printf("YES\n");elseprintf("NO\n");return 0;
}
?
2. 輸出1-100之間的奇數
設置循環條件<=100,即遍歷1-100的整數,打印出來,每打印一次,i+=2,即相鄰的奇數。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int i = 1;while (i <= 100){printf("%d ", i);i = i + 2;//i+=2;}return 0;
}
?2.2 switch語句
switch語句也是一種分支語句。
常常用于多分支的情況。
比如:
輸入1,輸出星期一
輸入2,輸出星期二
輸入3,輸出星期三
輸入4,輸出星期四
輸入5,輸出星期五
輸入6,輸出星期六
輸入7,輸出星期日
那我沒寫成 if...else if ...else if 的形式太復雜,那我們就得有不一樣的語法形式。
這就是switch 語句。
switch(整型表達式)
{
語句項;
}
而語句項是什么呢?
//是一些case語句:
//如下:
case 整形常量表達式:
語句;
2.2.1 在switch語句中的 break
在switch語句中,我們沒辦法直接實現分支,搭配break使用才能實現真正的分支。
比如:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int day = 0;scanf("%d", &day);//4switch (day){case 1:printf("星期1\n");break;case 2:printf("星期2\n");break;case 3:printf("星期3\n");break;case 4:printf("星期4\n");break;case 5:printf("星期5\n");break;case 6:printf("星期6\n");break;case 7:printf("星期天\n");break;}return 0;
}
break實現了switch語句中跳出分支的效果,如果我們不用break,那么上面代碼會從case1持續進行到case7。
有時候我們的需求變了:
1. 輸入1-5,輸出的是“weekday”;
2. 輸入6-7,輸出“weekend”
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("weekday\n");break;case 6:case 7:printf("weekend\n");break;}return 0;
}
break語句 的實際效果是把語句列表劃分為不同的分支部分。
編程好習慣
在最后一個 case 語句的后面加上一條 break語句。
(之所以這么寫是可以避免出現在以前的最后一個 case 語句后面忘了添加 break語句)。
2.2.2 default子句
如果表達的值與所有的case標簽的值都不匹配怎么辦?
其實也沒什么,結構就是所有的語句都被跳過而已。
程序并不會終止,也不會報錯,因為這種情況在C中并不認為是個錯誤。
但是,如果你并不想忽略不匹配所有標簽的表達式的值時該怎么辦呢?
你可以在語句列表中增加一條default子句,把下面的標簽
default:
寫在任何一個 case 標簽可以出現的位置。
當 switch 表達式的值并不匹配所有 case 標簽的值時,這個 default 子句后面的語句就會執行。
所以,每個switch語句中只能出現一條default子句。
但是它可以出現在語句列表的任何位置,而且語句流會像執行一個case標簽一樣執行default子句。
編程好習慣
在每個 switch 語句中都放一條default子句是個好習慣,甚至可以在后邊再加一個 break 。
比如:?
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int day = 0;scanf("%d", &day);//4switch (day){case 1:printf("星期1\n");break;case 2:printf("星期2\n");break;case 3:printf("星期3\n");break;case 4:printf("星期4\n");break;case 5:printf("星期5\n");break;case 6:printf("星期6\n");break;case 7:printf("星期天\n");break;default:printf("輸入錯誤,請重新輸入"\n);break;}return 0;
}
2.2.3 練習
大家覺得這段代碼的結果是什么呢?
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int n = 1;int m = 2;switch (n){case 1:m++;case 2:n++;case 3:switch (n){//switch允許嵌套使用case 1:n++;case 2:m++;n++;break;}case 4:m++;break;default:break;}printf("m = %d, n = %d\n", m, n);return 0;
}
答案是:
?
為什么呢?因為沒遇到break之前程序會一直運行,所以在跳出switch(n)后還會進入case4,再結束運行。?
?3.循環語句
while
for
do while
3.1 while循環
我們已經掌握了,if語句:
if(條件)
語句;
當條件滿足的情況下,if語句后的語句執行,否則不執行。
但是這個語句只會執行一次。
由于我們發現生活中很多的實際的例子是:同一件事情我們需要完成很多次。
那我們怎么做呢?
C語言中給我們引入了: while 語句,可以實現循環。
//while 語法結構
while(表達式)
循環語句;
while語句執行的流程:
?大家看看這兩段代碼的區別:
int main()
{if (1)printf("hehe\n");return 0;
}int main()
{while (1)printf("hehe\n");return 0;
}
if語句只會執行一次,而while的會一直執行,重復做同一件事。
比如我們實現:
在屏幕上打印1-10的數字。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <stdio.h>
int main()
{int i = 1;while (i <= 10){printf("%d ", i);i = i + 1;}return 0;
}
上面的代碼已經幫我了解了 while 語句的基本語法,那我們再了解一下:
3.1.1 while語句中的break和continue
1.break介紹
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int i = 1;while (i <= 10){if (i == 5)break;printf("%d ", i);i = i + 1;}return 0;
}
這里代碼輸出的結果是什么?
?總結:
break在while循環中的作用:
其實在循環中只要遇到break,就停止后期的所有的循環,直接終止循環。
所以:while中的break是用于永久終止循環的。
?2.continue介紹
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int i = 1;while (i <= 10){if (i == 5)continue;printf("%d ", i);i = i + 1;}return 0;
}
?
?
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int i = 1;while (i <= 10){i = i + 1;if (i == 5)continue;printf("%d ", i);}return 0;
}
?大家有沒有發現區別呢?其實continue的作用已經很明顯了。
總結:
continue在while循環中的作用就是:
continue是用于終止本次循環的,也就是本次循環中continue后邊的代碼不會再執行,
而是直接跳轉到while語句的判斷部分。進行下一次循環的入口判斷
?3.2 for循環
我們已經知道了while循環,但是我們為什么還要一個for循環呢?
首先來看看for循環的語法:
3.2.1 語法
for(表達式1; 表達式2; 表達式3)
循環語句;
表達式1
表達式1為初始化部分,用于初始化循環變量的。
表達式2
表達式2為條件判斷部分,用于判斷循環時候終止。
表達式3
表達式3為調整部分,用于循環條件的調整。
實際的問題:
使用for循環 在屏幕上打印1-10的數字:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int i = 0;//for(i=1/*初始化*/; i<=10/*判斷部分*/; i++/*調整部分*/)for (i = 1; i <= 10; i++){printf("%d ", i);}return 0;
}
for循環的執行流程圖:
現在我們對比一下for循環和while循環:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int i = 0;
//實現相同的功能,使用while
i = 1;//初始化部分
while (i <= 10)//判斷部分
{printf("hehe\n");i = i + 1;//調整部分
}
//實現相同的功能,使用for
for (i = 1; i <= 10; i++)
{printf("hehe\n");
}
可以發現在while循環中依然存在循環的三個必須條件,但是由于風格的問題使得三個部分很可能偏離較遠,這樣查找修改就不夠集中和方便。
所以,for循環的風格更勝一籌;for循環使用的頻率也最高。
3.2.2 break和continue在for循環中
我們發現在for循環中也可以出現break和continue,他們的意義和在while循環中是一樣的。
但是還是有些差異:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int i = 0;for (i = 1; i <= 10; i++){if (i == 5)break;printf("%d ", i);}return 0;
}
?
?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int i = 0;for (i = 1; i <= 10; i++){if (i == 5)continue;printf("%d ", i);}return 0;
}
?
?continue在while循環中跳過本次循環后面的代碼,有可能會跳過調整部分,但是在for循環中不會,因為continue只會跳過后面的部分再來到調整部分,這就是兩者的區別,也是for循環的優勢。
在for循環中,如果遇到continue,會跳過continue后邊的代碼,直接去循環的調整部分
break在for循環中也是直接終止循環,只要遇到break,循環就直接結束。
3.2.3 for語句的循環控制變量
建議:
1. 不可在for 循環體內修改循環變量,防止 for 循環失去控制。
2. 建議for語句的循環控制變量的取值采用“前閉后開區間”寫法。
int i = 0;
//前閉后開的寫法
for(i=0; i<10; i++)
{}
//兩邊都是閉區間
for(i=0; i<=9; i++)
{}
3.2.4 一些for循環的變種
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{//代碼1for (;;){printf("hehe\n");}//for循環中的初始化部分,判斷部分,調整部分是可以省略的,但是不建議初學時省略,容易導致問題。
return 0;
}
?這是一個雙層循環,一共打印了9次。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int i = 0;int j = 0;//這里打印多少個hehe?for (i = 0; i < 3; i++){for (j = 0; j < 3; j++){printf("hehe\n");}}return 0;
}
?i=0時,第二個for循環打印了3次,i++,再進去第一個for循環,i<3,再進去第二個循環的時候j是3,直接退出循環,所以說不要隨意省略初始化部分。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int i = 0;int j = 0;//如果省略掉初始化部分,這里打印多少個hehe?for (; i < 3; i++){for (; j < 3; j++){printf("hehe\n");}}return 0;
}
?使用多余一個變量控制循環::
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int x, y;for (x = 0, y = 0; x < 2 && y < 5; ++x, y++){printf("hehe\n");}return 0;
}
3.2.5 一道筆試題:
請問循環要循環多少次?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int i = 0;int k = 0;for (i = 0, k = 0; k = 0; i++, k++)k++;return 0;
}
大家注意k=0是判斷部分,=是賦值符號,c語言判斷0為假,非0為真,所以一次都不會循環。
今天的分享到這里就結束啦!感謝烙鐵們的閱讀,讓我們下一篇文章再見,下一篇文章會有個小游戲-猜數字游戲,非常詳細哦。
?