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