1. 程式人生 > >C語言——選擇結構

C語言——選擇結構

選擇結構和條件判斷

(一)if語句——實現兩個分支

if 語句可以寫成不同形式

  1. if (表示式) 語句1——可以沒有else語句
  2. if (表示式)
    語句 1
    else
    語句 2
    ——————————有else語句
  3. if (表示式 1) 語句 1
    else if (表示式 2) 語句 2
    else if (表示式3) 語句 3
    … …
    ———————————可以使用巢狀
    注意:
    (1)如果語句 1,語句 2,,,是複合語句,應該使用花括號括起來。即寫成一個程式碼塊。
    (2)內嵌語句可以是 if 語句 ,如果不使用花括號的話, else與最近的 if 相匹配。最好寫成程式碼塊形式。
    舉例如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int a = 0;
 int b = 1;
 
 if (1 == a)
    if (b == 1)
  printf("bbbbbb");
 else
  printf("aaaaaa");                  //主觀感覺輸出應該為aaaaaa,
                           //實際上else與最近的if相匹配,所以什麼也不輸出

 system("pause");
 return 0;
}

執行結果如下:
在這裡插入圖片描述
(3)if語句後的表示式如果是判斷表示式中的等於的話,最好將用於比較的值放在左邊,防止寫成賦值表示式。這樣的話寫錯的話容易報錯。
如:

 int main()
{
 int a = 0;
 if (0 == a)                //如 此處如果寫 a == 0的話就容易寫成 a = 0
  printf("%d", a);
 system("pause");
 return 0;
}

(4)C語言中0表示假,非0表示真。
所以if 後面的表示式可以是一個變數。
(5)if語句的書寫規範

  • bool值和0比較
    bool表示真假,只有 true 和 false
    在C語言中bool值的語義是 0為假,非0為真,true和false這些識別符號在C中一定會被定義為一個固定值。
    flag是個整數,可以被賦值為非0整數表示真。
    在表示式中不能寫成 if(flag == true)
    原因是:如果flag本身是5,非0,表示真,true為3的話,flag == true為假,則表示式假。
    錯誤程式碼如下:
 int flag;
 if (flag == TRUE);
 {
  printf("TRUE");
 }
 if (flag == FALSE)
 {
  prirntf("FALSE");
 }

正確 形式應該為

 if (flag);
 {
  printf("TRUE");
 }
 if (!flag)
 {
  prirntf("FALSE");
 }
  • 整型變數和0比較
    如果一個變數就是整型,(不表示真假)則這個數不能和0比較
int num = 0;
//正確寫法
if(0 == num)

//錯誤寫法
if(num)      //如果num本身是0的話,則該語句判斷為假,就不能執行if語句



(5)if(表示式1)語句 1 else 語句 2
等價於
表示式1 ? 表示式 2 : 表示式3


舉例程式碼如下:

 int main()
{
 int max = 0;
 int a = 1;
 int b = 2;
 if (a > b)
 {
  max = a;
   }
 else
 {
  max = b;
 }
 system("pause");
 return 0;
}

該程式碼等價於以下程式碼

 int main()
{
 int max;
 int a = 1;
 int b = 2;
 max = (a > b) ? a: b;
 system("pause");
 return 0;
}

(二)switch語句——實現多分支

switch語句的一般形式
switch(表示式)
{
case 常量1:語句 1
case 常量2:語句 2
case 常量3:語句 3

default : 語句n
}


· switch 後面的表示式為整數型別,包括字元型,不能為字串。

· case 後面可以跟一個常量或常量表達式,用來標誌一個位置。
執行switch語句時,先計算表示式的值,然後將該值與case後的標號比較,如果相同,則轉到該case後的語句,如果不相同,則與後一個case判斷,如果沒有相匹配的case,則執行default標號後的語句。
·可以沒有default語句,如果沒有相匹配的case,則執行switch後的下一個語句。
· 各case標號與default標號順序沒有影響。
· 每一個case常量必須不相同,不能出現一個表示式的值有兩種及以上執行方案。
· 一般,每個case子句後,應該用一個break語句跳出switch結構。
否則會一直執行下去。


舉例如下

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 switch (n)
 {
 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;
 }
 system("pause");
 return 0;
}

執行結果如下
在這裡插入圖片描述

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 switch (n)
 {
 case 1:
  printf("今天是星期一\n");
 case 2:
  printf("今天是星期二\n");
 case 3:
  printf("今天是星期三\n");
 case 4:
  printf("今天是星期四\n");
 case 5:
  printf("今天是星期五\n");
 case 6:
  printf("今天是星期六\n");
 case 7:
  printf("今天是星期天\n");
 default:
  ;
 }
 system("pause");
 return 0;
}

執行結果如下
在這裡插入圖片描述

· 多個case標號可以公用一個執行語句

舉例如下

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 switch (n)
 {
 case 1:
 case 2:
 case 3:
 case 4:
 case 5:
  printf("今天是工作日\n");
  break;
 case 6:
 case 7:
  printf("今天是休息日\n");
  break;
 default:
  break;
 }
 system("pause");
 return 0;
}

執行結果如下
在這裡插入圖片描述