流程控制
流程控制三種結(jié)構(gòu): 順序結(jié)構(gòu), 選擇結(jié)構(gòu), 循環(huán)結(jié)構(gòu)
選擇結(jié)構(gòu)
- C語(yǔ)言中提供了兩大選擇結(jié)構(gòu),分別是if 和switch;
1. if條件語(yǔ)句
- if 的第一種表達(dá)式
- 如果表達(dá)式為真,執(zhí)行語(yǔ)句塊1,否者不執(zhí)行;
if(條件表達(dá)式){
條件成立執(zhí)行的語(yǔ)句;
}
if(age >= 18){
printf("上網(wǎng)去\n");
}
printf("買飲料\n");
- if的第二種表達(dá)式
- 如果表達(dá)式為真,執(zhí)行語(yǔ)句塊1,否者執(zhí)行語(yǔ)句塊2;
- else 不能脫離if單獨(dú)使用;
if(條件表達(dá)式){
條件成立執(zhí)行的語(yǔ)句;
}else{
條件不成立執(zhí)行的語(yǔ)句;
}
if(num % 2 == 0){
printf("num is 偶數(shù)");
}else{
printf("num is 奇數(shù)");
}
- if的第三種表達(dá)式
- 從上到下依次判斷條件跳大神,哪個(gè)表達(dá)式成立,就會(huì)執(zhí)行那個(gè)條件表達(dá)式后面{}的內(nèi)容;
- 如果所有條件表達(dá)式都不成立,就執(zhí)行else后面括號(hào)中的內(nèi)容;
if(表達(dá)式1){
條件滿足執(zhí)行語(yǔ)句塊1;
}else if(表達(dá)式2){
條件滿足執(zhí)行語(yǔ)句塊2;
}else if(表達(dá)式3){
條件滿足執(zhí)行語(yǔ)句塊3;
}else{
條件不成立執(zhí)行的語(yǔ)句;
}
if(age > 18){
printf("上大學(xué)");
}else if (age > 15){
printf("上高中");
}else if(age > 12){
printf("上初中");
}else if(age > 7){
printf("上小學(xué)")
}else{
printf("上幼兒園");
}
- if嵌套
- if中可以繼續(xù)嵌套if, else中也可以繼續(xù)嵌套;
if(表達(dá)式1){
語(yǔ)句塊1;
if(表達(dá)式2){
語(yǔ)句塊2;
}
}else{
if(表達(dá)式3){
語(yǔ)句塊3;
}else{
語(yǔ)句塊4;
}
}
-
if注意點(diǎn)
- if語(yǔ)句不用寫分號(hào);
#include <stdio.h> int main() { int num = 10; // (;)也是一條語(yǔ)句, 稱之為空語(yǔ)句 if(num >18); // 寫了這個(gè)分號(hào);{}中的內(nèi)容就脫離if的控制 { printf("該去上大學(xué)了"); } return 0; // 條件不滿足還是會(huì)執(zhí)行{}中的內(nèi)容; // 輸出該去上學(xué)了 }- 當(dāng)if else后面只有一條語(yǔ)句時(shí), if else后面的大括號(hào)可以省略,如果省略大括號(hào),那么僅僅距離if最近的那個(gè)條語(yǔ)句受到if的控制
- 當(dāng)if else后面的大括號(hào)被省略時(shí),** else會(huì)自動(dòng)和距離最近的一個(gè)if匹配**
- 如果if 省略了大括號(hào), 那么后面不能定義變量
#include <stdio.h> int main() { if(1) int num = 10; // 系統(tǒng)會(huì)報(bào)錯(cuò) printf("num = %i", num); return 0; }#include <stdio.h> int main(){ if(0){ int num1 = 10; }else int num2 = 20; // 系統(tǒng)報(bào)錯(cuò) printf("num2 = %i", num2); return 0; }- C語(yǔ)言中分號(hào)(;)也是一條語(yǔ)句, 稱之為空語(yǔ)句
- 但凡遇到比較一個(gè)變量等于或者不等于某一個(gè)常量的時(shí)候,把常量寫在前面
- 任何數(shù)值都有真假性;在企業(yè)開(kāi)發(fā)中如果要判斷是否相等,建議把常量寫在前面,把變量寫在后面
- {}可以單獨(dú)出現(xiàn),{}出現(xiàn)的時(shí)候是一個(gè)代碼塊; 主要用于隔離變量使用;代碼塊外面是不能訪問(wèn)代碼塊內(nèi)的變量;代碼塊里面可以訪問(wèn)代碼塊外面的變量;
{ int age = 18; printf("age = %i\n", age); } printf("age = %i\n",age); //會(huì)報(bào)錯(cuò) -
if 練習(xí)
- 從鍵盤輸入一個(gè)整數(shù),判斷其是否是偶數(shù),如果是偶數(shù)就輸出YES,否則輸出NO;
#include <stdio.h> int main(){ //從鍵盤輸入一個(gè)整數(shù),判斷其是否是偶數(shù),如果是偶數(shù)就輸出YES,否則輸出NO; // 定義一個(gè)變量 int num = -1; // 提示用戶如何輸入 printf("請(qǐng)輸入一個(gè)整數(shù),以回車鍵結(jié)束;\n"); // 接收用戶的輸入 scanf("%i", &num); // if語(yǔ)句判斷是偶數(shù)則輸出YES ,否則輸出NO; if(0 == num % 2){ // 偶數(shù) printf("YES"); }else{ // 奇數(shù) printf("NO"); } return 0; }- 接收用戶輸入的1~7的整數(shù),根據(jù)用戶輸入的整數(shù),輸出對(duì)應(yīng)的星期幾
#include <stdio.h> int main() { //接收用戶輸入的1~7的整數(shù),根據(jù)用戶輸入的整數(shù),輸出對(duì)應(yīng)的星期幾 // 定義變量 int num = -1; // 提示用戶輸入 printf("請(qǐng)輸入1~7的整數(shù):"); // 接收用戶的輸入 scanf("%i", &num); // 判斷對(duì)應(yīng)的值 if(num < 1 || num > 7){ printf("對(duì)不起,你輸入的數(shù)有誤! 請(qǐng)重新打開(kāi)輸入\n"); }else if(1 == num){ printf("星期一\n"); }else if(2 == num){ printf("星期二\n"); }else if(3 == num){ printf("星期三\n"); }else if(4 == num){ printf("星期四\n"); }else if(5 == num){ printf("星期五\n"); }else if(6 == num){ printf("星期六\n"); }else { printf("星期日"); } return 0; }- 接收用戶輸入的一個(gè)整數(shù)month代表月份,根據(jù)月份輸出對(duì)應(yīng)的季節(jié)
#include <stdio.h> int main() { // 接收用戶輸入的一個(gè)整數(shù)month代表月份,根據(jù)月份輸出對(duì)應(yīng)的季節(jié) // 定義變量 int month = -1; // 提示用戶正確輸入 printf("請(qǐng)輸入月份:"); // 接收數(shù)據(jù) scanf("%i", &month); // 判斷輸入,輸出相應(yīng)的季節(jié) if(month < 1 || month > 12){ printf("請(qǐng)重新輸入月份"); }else if(month >= 3 && month <= 5){ printf("春季\n"); }else if(month >=6 && month <= 8){ printf("夏季\n"); }else if(month >= 9 && month <= 11){ printf("秋季\n"); }else{ printf("冬季\n"); } return 0; }- 接收用戶輸入的兩個(gè)整數(shù),判斷大小后輸出較大的那個(gè)數(shù)
#include <stdio.h> int main() { // 接收用戶輸入的兩個(gè)整數(shù),判斷大小后輸出較大的那個(gè)數(shù) // 定義兩個(gè)變量; int a = -1, b = -1; // 提示用戶輸入兩個(gè)數(shù) printf("請(qǐng)輸入兩個(gè)數(shù), 以逗號(hào)隔開(kāi):\n"); // 接收用戶輸入的兩個(gè)數(shù) scanf("%i,%i", &a, &b); // 判斷大小 if(a > b){ // a>b,輸出a; printf("Max = %i", a); }else{ // b > a, 輸出b; printf("Max = %i", b); } return 0; }- 接收用戶輸入的三個(gè)整數(shù),判斷大小后輸出較大的那個(gè)數(shù)
// 定義三個(gè)變量: int a = -1, b = -1, c = -1; // 定義最大值 int max = -1; // 提示用戶輸入三個(gè)整數(shù); printf("請(qǐng)輸入三個(gè)整數(shù),以逗號(hào)隔開(kāi):\n"); // 接收數(shù)據(jù) scanf("%i,%i,%i", &a, &b, &c); // 判斷大小 if(a > b){ if(a > c){ max = a; }else{ max = c; } }else{ if(b > c){ max = b; }else{ max = c; } } // 輸入最大值; printf("max = %i", max);- 接收用戶輸入的三個(gè)整數(shù),排序后輸出
// 定義用戶輸入的三個(gè)數(shù) int a = -1, b = -1, c = -1; // 定義臨時(shí)變量 int temp = -1; //提示用戶輸入格式: printf("請(qǐng)輸入三個(gè)整數(shù), 以逗號(hào)隔開(kāi), 最后以回車結(jié)束:\n"); // 接收用戶輸入: scanf("%i,%i,%i", &a, &b, &c); // 進(jìn)行兩個(gè)比較; if(a > b){ temp = a; a = b; b = temp; } if(b > c){ // 得到最值c temp = b; b = c; c = temp; } if(a > b){ // 得到最值b temp = a; a = b; b = temp; } // 輸出結(jié)果 printf("%i,%i,%i" , a, b, c);
2. 選擇結(jié)構(gòu) switch
- 格式:
switch(表達(dá)式){
case 常量表達(dá)式1: // 相當(dāng)于else if
語(yǔ)句1;
break;
case 常量表達(dá)式2:
語(yǔ)句2;
break;
case 常量表達(dá)式n:
語(yǔ)句n;
break;
default: // 相當(dāng)于else
語(yǔ)句n+1;
break;
}
- 執(zhí)行流程:
- 1.計(jì)算switch后面()中表達(dá)式的結(jié)果;
- 2.利用計(jì)算的結(jié)果從上之下的和switch后面{}中的case的表達(dá)式的值依次比較;
- 3.一旦發(fā)現(xiàn)switch 表達(dá)式的值和case表達(dá)式的值相同,就執(zhí)行該case后面的語(yǔ)句;
- 4.一旦某個(gè)case被執(zhí)行,其他的case就不會(huì)執(zhí)行了
- 5.如果所有case表達(dá)式的值和switch表達(dá)式的值都不相等,那么執(zhí)行default后面的語(yǔ)句;
int day = 3;
switch (day){
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
default :
printf("Other");
break;
}
// 執(zhí)行結(jié)果為: Other;
switch注意點(diǎn)
- switch中只要任意一個(gè)case匹配, 其它所有的case和default都會(huì)失效. 所以如果case和default后面沒(méi)有break就會(huì)出現(xiàn)穿透問(wèn)題,break在switch中的作用,就是跳出switch語(yǔ)句(結(jié)束當(dāng)前的switch語(yǔ)句);
image
switch條件表達(dá)式的類型必須是整型, 或者可以被提升為整型的值(char、short)
case的值只能是常量,不能是變量, 并且還必須是整型, 或者可以被提升為整型的值(char、short)
case后面常量表達(dá)式的值不能相同
case后面不能定義變量要想定義變量,必須給case加上大括號(hào)
switch中default可以省略
switch中default的位置不一定要寫到最后, 無(wú)論放到哪都會(huì)等到所有case都不匹配才會(huì)執(zhí)行(穿透問(wèn)題除外)記住一點(diǎn): default永遠(yuǎn)寫在最后;
