if else用法詳解,C語言if else用法完全攻略

2020-07-16 10:04:23
if else 語句是一種選擇結構,可以讓程式碼選擇執行。所謂選擇執行,就是“某些程式碼可能執行,也可能不執行,有選擇地執行某些程式碼”。

if 的最簡單用法

if最簡單的格式是:

if(表示式) {語句}

功能:如果表示式為真,就執行下面的語句;如果表示式為假,就不執行下面的語句。

下面給大家寫一個程式:
#include <stdio.h>
int main(void)
{
    if (3>2)
    {
        printf("I Love Youn");
    }
    return 0;
}
執行結果:
I Love You

這個是 if 最簡單的程式。首先,前面講程式碼規範化的時候講過,if 與它後面的括號之間要加一個空格。其次,在前面講過判斷“真”、“假”分為兩種,一種是數值是否為零,另一種是表示式是否成立。所以上面的程式表示式成立,故執行其下的輸出語句。

再將 if 後面的表示式改成數位看看:
# include <stdio.h>
int main(void)
{
    if (2)
    {
        printf("I Love Youn");
    }
    return 0;
}
執行結果:
I Love You

或這樣寫:
# include <stdio.h>
int main(void)
{
    int i;
    if (i = 2)
    {
        printf("I Love Youn");
    }
    return 0;
}
執行結果:
I Love You

再改成0看看:
# include <stdio.h>
int main(void)
{
    if (0)
    {
        printf("I Love Youn");
    }
    return 0;
}
編譯並執行,什麼也不輸出。

所以只要 if 後面的表示式成立或非零,就執行其下的語句。表示式為0的時候即假,就不執行其下的語句了。

if 的控制範圍問題

這個問題更重要!先給大家寫一個程式:
# include <stdio.h>
int main(void)
{
    if (0)
    printf("I Love Youn");
    printf("I Love You Toon");
    return 0;
}
執行結果:
I Love You Too

為什麼“I Love You”沒有輸出而“I Love You Too”卻輸出了?因為在C語言中,if 只能控制其後的一個語句。如果要控制多個語句就必須加大括號{}。所以在上面這個程式中 if 只能控制第一個 printf,而 if 後的表示式為 0,所以第一個 printf 不會執行,所以“I Love You”不會輸出。而第二個 printf 不在 if 的控制範圍內,所以 if 語句執行完之後順序往下執行第二個 printf,所以“I Love You Too”會輸出。

如果希望 if 控制兩個 printf 的話就加上大括號,像下面這樣:
# include <stdio.h>
int main(void)
{
    if (0)
    {
        printf("I Love Youn");
        printf("I Love You Toon");   
    }
    return 0;
}
這樣兩個printf都不會輸出。

但在講規範化的時候說過,if、else、for、while、do 後面的執行語句不論有多少行,就算只有一行也要加{}。這是規範問題,大家一定要記住。按規範書寫就不容易出錯,看著也舒服。

if…else 的用法

先給大家寫一個程式:
# include <stdio.h>
int main(void)
{
    int i, j;
    printf("請輸入兩個數:");  //提示輸入
    scanf("%d %d", &i, &j);  //注意取地址符&amp;
    if (i>j)
    {
        printf("i大於jn");
    }
    else
    {
        printf("i小於jn");
    }
    return 0;
}
執行結果:
請輸入兩個數:43 56
i小於j

這裡我首先要強調的是:在前面講 scanf 的時候,為了避免讀者產生混亂,有些內容一直未講,專門放到這裡來講。

前面強調,scanf 中雙引號內多個“輸入控制符”之間不要加任何“非輸入控制符”。但這裡我要說的是:可以加一個符號,就是“空格”。

空格在 scanf 中比較特殊,雖然它是“非輸入控制符”,但它又算不上是真正的需要“原樣輸入”。因為就算不加空格,從鍵盤輸入的時候還是要加空格(或迴車)。而且在 scanf 中新增一個空格,輸入的時候輸入 100 個空格也是正確的;在 scanf 中新增 100 個空格,而輸入的時候只輸入一個空格也是正確的。所以說算不上是真正的“原樣輸入”。

那麼 scanf 中%d之間為什麼要加空格呢?原因只有一個——“好看”。如果不加空格的話,看起來就很擠,不好看。但是儘管如此,仍然建議你們什麼都不要加,統一思維和用法。在實際程式設計中也是不要求加空格的,在這裡只是告訴你們可以這麼做。

下面來看 if…else,上面那個程式是最簡單的 if…else 用法。這裡主要強調三點:

1) 同樣,else 也只能控制到其後的一個語句,如果要控制多個語句的話必須要加大括號{}。但是這裡再強調:if、else、for、while、do 後面的執行語句不論有多少行,就算只有一行也要加{}

1) 程式碼規範化七大原則的第一個原則是“空行”,前面說過:兩個不同的功能塊之間要加空行。言外之意就是“兩個相同的功能塊之間就不需要加空行”。if 和 else 是相同的功能塊,所以它們之間不需要加空行。

3) if 可以沒有 else 單獨使用,這個前面已經應用過了。但如果要用 else,它必須是 if 的一部分。else 絕對不可能脫離if而單獨使用,這一點大家一定要注意。

下面將前面那個程式修改一下:
# include <stdio.h>
int main(void)
{
    int i, j;
    scanf("%d %d", &i, &j);
    if (i>j)
    {
        printf("i大於jn");
    }
    ;
    else
    {
        printf("i小於jn");
    }
    return 0;
}
這個程式你覺得有沒有錯?編譯一下發現有一個錯誤:

illegal else without matching if

意思是:不合法的 else 沒有匹配的 if。

為什麼會這樣?因為在 if 和 else 之間多加了一個分號。在C語言中,一個分號也是一條語句,叫“空語句”,就是一個什麼都不執行的語句。若在 if 和 else 中間加了一條語句,就將 else 和 if 分開了,就相當於 else 單獨使用了,所以就會報錯“沒有和else匹配的if”。這個程式也告訴我們,分號不能亂加。

這裡順便給大家介紹一下“三目運算子”。在前面講優先順序的時候提到過它。在整個C語言中只有一個三目運算子,它的格式是:

表示式1 ? 表示式2 : 表示式3

它就相當於:

if (表示式1)
{
    表示式2;
}
else
{
    表示式3;
}

雖然“三目運算子”的格式看起來程式碼比較少,但是我們一般都不用。因為那麼寫看起來很彆扭,而且它沒有 if…else 的邏輯清晰,所以我們一般還是使用 if…else。這個了解一下就可以了。

if…else if…else 的用法

還記得前面寫的一元二次方程的那個程式嗎?那個程式就是用 if…else if…else 寫的:
# include <stdio.h>
# include <math.h>
int main(void)
{
    //將三個係數儲存到計算機中
    int a = 1;  //“=”不表示相等,而是表示賦值
    int b = 2;
    int c = 1;
    double delta;  //delta存放的是b*b - 4*a*c的值
    double x1, x2;  //分別用於存放一元二次方程的兩個解
    delta = b*b - 4*a*c;
    if (delta > 0)
    {
        x1 = (-b + sqrt(delta)) / (2*a);
        x2 = (-b - sqrt(delta)) / (2*a);
        printf("該一元二次方程有兩個解,x1 = %f, x2 = %fn", x1, x2);
    }
    else if (0 == delta)
    {
        x1 = (-b) / (2*a);
        x2 = x1;  //左邊值賦給右邊
        printf("該一元二次方程有一個唯一解,x1 = x2 = %fn", x1);
    }
    else
    {
        printf("無解n");
    }
    return 0;
}
if…else if…else 比 if…else 複雜一點,但也很好理解。if…else if…else 的意思就是:“如果”第一個成立,就執行第一個;“否則如果”第二個成立就執行第二個;“否則”就執行第三個。這個應該很好理解吧,與我們平時講話時的思維邏輯一樣。

練習——求分數的等級

下面就來寫一個程式,這個程式是目前為止第一個比較有意義的程式。這個程式的功能是“求考試成績的等級”。即,輸入一個考試成績:
  • 如果為 90~100分,就輸出“優秀!”;
  • 如果為 80~89 分,就輸出“良好!”;
  • 如果為 60~79 分,就輸出“及格!”;
  • 如果為 0~59 分,就輸出“補考!繼續努力!”;
  • 如果分數不在這些範圍內就輸出“請重新輸入!”。
#include <stdio.h>
int main(void)
{
    float score;
    printf("請輸入您的考試成績:");
    scanf("%f", &score);
    if (score>=90 && score<=100)
    {
        printf("優秀!n");
    }
    else if (score>=80 && score<=89)
    {
        printf("良好!n");
    }
    else if (score>=60 && score<=79)
    {
        printf("及格!n");
    }
    else if (score>=0 && score<=59)
    {
        printf("補考!繼續努力!n");
    }
    else
    {
        printf("請重新輸入!n");
    }
    return 0;
}
score>=90 && score<=100千萬不能寫成90<=score<=100,這樣寫是錯誤的。這是數學中的寫法,在C語言中是不能這麼寫的。但我並不是說這樣寫語法有問題,而是說這樣寫無法實現我們所需要的功能。

在C語言中,90<=score<=100這種寫法是允許的,編譯的時候不會報錯。但如果寫成90<=score<=100,那麼不管輸入多少分,輸出都是“優秀!”。大家想想為什麼?

因為按照優先順序,執行的時候肯定是從左到右,所以肯定是先執行 90<=score。但是 90<=score 的運算結果是一個邏輯值,要麼成立,要麼不成立。我們前面講過,邏輯值要麼真、要麼假,真就是 1,假就是 0。所以不管你輸入多少分,90<=score 的執行結果要麼是 1,要麼是 0,肯定 <=100。所以不管輸入多少分,90<=score<=100永遠都成立,所以輸出的永遠都是“優秀!”。所以不能那麼寫。

下面寫一個程式看一下:
# include <stdio.h>
int main(void)
{
    float score = 1000;
    int i = (90<=score<=100);
    printf("i = %dn", i);
    return 0;
}
執行結果:
i = 1

不管 score 是多少,90<=score<=100永遠都成立,所以 i 永遠都是 1。