C語言中文網 目錄

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

if else 語句是一種選擇結構,可以讓代碼選擇執行。所謂選擇執行,就是“某些代碼可能執行,也可能不執行,有選擇地執行某些代碼”。

if 的最簡單用法

if最簡單的格式是:

if(表達式) {語句}

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

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

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

再將 if 后面的表達式改成數字看看:
# include <stdio.h>
int main(void)
{
    if (2)
    {
        printf("I Love You\n");
    }
    return 0;
}
運行結果:
I Love You

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

再改成0看看:
# include <stdio.h>
int main(void)
{
    if (0)
    {
        printf("I Love You\n");
    }
    return 0;
}
編譯并運行,什么也不輸出。

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

if 的控制范圍問題

這個問題更重要!先給大家寫一個程序:
# include <stdio.h>
int main(void)
{
    if (0)
    printf("I Love You\n");
    printf("I Love You Too\n");
    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 You\n");
        printf("I Love You Too\n");   
    }
    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大于j\n");
    }
    else
    {
        printf("i小于j\n");
    }
    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大于j\n");
    }
    ;
    else
    {
        printf("i小于j\n");
    }
    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 = %f\n", x1, x2);
    }
    else if (0 == delta)
    {
        x1 = (-b) / (2*a);
        x2 = x1;  //左邊值賦給右邊
        printf("該一元二次方程有一個唯一解,x1 = x2 = %f\n", 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 = %d\n", i);
    return 0;
}
運行結果:
i = 1

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

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo