C語言----選擇的巢狀(進階篇十八)
邏輯表示式
※C語言中沒有其它語言的“真”和“假”值,英文叫TRUE和FALSE值,也叫邏輯型變數。所有的表示式,只要非0(包括負數)即為真,0即為假。真和假就是我們平時所說的“條件成立”與“不成立”。
※關係和邏輯運算子也可以和算術運算子一起參加混合運算,與算術運算不同的是,關係和邏輯運算的結果只有0和1。
假如int a=3,b=4,c=0;
a&&b的結果為1,b||c的結果為1,a&&c的結果為0。!a+c>b||a-b的結果是 TRUE
※ a && b && c中,如果a為假,就不必再判斷b和c,對於(i=0) && (j=20)這樣的式子,j=20這條賦值語句永遠也不會執行。
※同理,a || b || c,如果a為真,就不必再判斷b和c,對於 (i=5) || (j=20)這樣的式子,後面的j=20也不會執行。
條件運算子
格式:
條件表示式1 ?表示式2 :表示式3
它相當於普通的if分支語句,條件表示式1成立(非0值),執行表示式2,不成立(0值),執行表示式3。如果將它作為表示式,將執行過的值作為整個表示式的最終值。
條件表示式應用的一個典型例子就是取兩數中的最大值:
int max,a=3,b=5;
max=a>b?a:b;
它相當於
if(a>b)max=a;
else max=b;
設int a=5,b=6,表示式(++a= =b- -)?++a:- -b的值是 7
巢狀的if
定義:if中還有一層if,或者else中還有if
程式1
// 18-1賬號檢查.c #include <stdio.h> #pragma warning(disable:4996); main() { int account = 1314555, password = 123456; //儲存的賬號和密碼 int user_name, user_password; //使用者輸入的賬號密碼 printf("請輸賬號:"); scanf("%d",&user_name); //輸入賬號 if (account == user_name) //輸入的和儲存的作比較 { printf("賬號正確,請輸入密碼:"); scanf("%d", &user_password); //輸入的密碼 if (user_password == password) //輸入的密碼作比較 { printf("登入中..."); } else { printf("密碼錯誤!\n"); } } else { printf("賬號錯誤!\n"); } }
※巢狀的層數過多,if語句的配對容易出問題,這種問題主要出現在if和else數目不一樣的情況下,如:
if (a<5)
if (b<5) printf (“b\n”);
else
if (c<5) printf (“c\n”);
else printf (“d\n”);
程式作者想通過格式的改變將第一個else和第一個if語句配對,實際上編譯器有自己的配對方式:它會將else與離自己最近的if語句配對,上面的語句實際上被編譯器配對成:
if (a<5)
if (b<5) printf (“b\n”);
else
if (c<5) printf (“c\n”);
else printf (“d\n”);
如果想強制配對,請多使用花括號:
if (a<5)
{
if (b<5) printf (“b\n”);
}
else
{
if (c<5) printf (“c\n”);
else printf (“d\n”);
}
編寫程式:輸入a、b、c三個數,打印出最大者。
// 18-2輸出最大值.c #include <stdio.h> main() { int a, b, c; //定義三個變數 int max; //最大值 printf("請輸入三個用逗號隔開的數:"); scanf_s("%d,%d,%d", &a, &b, &c); //使用者輸出的三個數 max = a; if (max<b) max = b; if (max<c) max = c; printf("%d\n", max); }