C語言自學《三》---- 條件判斷

###算術比較 下面列出了兩個操做數用於比較的算術比較運算符express

它們的運算結果會獲得int類型的值,若是爲真則結果爲1,若是爲假結果爲0 這些表達式稱爲邏輯表達式或者布爾表達式,由於每一個表達式都會等到兩個結果之一:truefalseapi

  • < 左操做數小於右操做數
  • <= 左操做數小於等於右操做數
  • == 左操做數等於右操做數
  • != 左操做數不等於右操做數
  • > 左操做數大於右操做數
  • >= 左操做數大於等於右操做數

###if語句less

在瞭解了邏輯表達式以後,就能夠配合if語句來對程序進行流程的控制函數

代碼示例:測試

<!-- lang: cpp -->

#include <stdio.h>

int main(){
    int a = 10;
    int b = 11;
    if(a<b) {
        printf("a<b");
    } else if(a>b) {
        printf("a>b");
    } else {
        printf("a=b");
    }

    //因爲if語句控制表達式要生成一個布爾結果,因此編譯器要將if表達式的數值結果轉換爲bool類型
    //根據上面的結論,能夠想象,下面的例子(當count值爲0時是false,只有在非0時才執行if代碼塊內的語句)
    int count = 0;    //因爲是0因此下面的if判斷沒有進去
    if(count){    //只有當非0時纔是true,由於0是false,1是true
        printf("The value of count is not zero. \n");
    }
}

####嵌套的if語句編碼

嵌套if語句就是if語句中再包含if語句,更精確的控制,只有當最外層的if爲true時,才能進入到裏層的if判斷rest

代碼示例:code

<!-- lang: cpp -->

#include <stdio.h>
#includ <limits.h>

int main(){

    long test = 0L;

    printf("Enter an integer less than %ld\n",LONG_MAX);
    scanf(" %ld",&test);

    if(test % 2L == 0L) {
        printf("The number %ld is even",test);

        if((test / 2L) % 2L == 0L) {
            printf("\nHalf of %ld is also even",test);
            printf("\nThat's interesting isn's it?\n");
        }
    } else {
        printf("The number %ld is odd\n",test);
    }
}

####多項選擇語句else if 語句圖片

一組選項中選擇一項的語句 每一個if表達式都可任意,只要其結果是true或者false便可 若是第一個if表達式爲false,就執行下一個if表達式,直到找到一個結果爲trueif表達式爲止input

代碼示例:

<!-- lang: cpp -->

//注意,在第一個if語句後,不須要測試if條件中的下限,由於若是執行到某個if,前面的測試就必定是false
if(salary < 5000) {
    printf("Your pay is very poor.");     //pay < 5000
} else if(salary < 15000) {
    printf("Your pay is not good.");     //pay < 15000
} else if(salary < 50000) {
    printf("Your pay is not bad.");       //pay < 50000
} else if(salary < 100000) {
    printf("Your pay is very good.");    //pay < 100000
} else {
    printf("Your pay is exceptional.");  //pay >= 100000
}

####多項選擇語句switch 語句

switch語句容許根據一個整數表達式的結果,從一組動做中選擇一個動做 switch語句沒有else if語句那麼靈活,但在許多狀況下使用起來很簡單

代碼示例:

<!-- lang: cpp -->

switch(ticket_number)
{
    case 35:
        printf("Congratulations! You win first prize!");
        break;        
    case 122:
        printf("You are in luck - second prize.");
        break;
    case 78:
        printf("you are in luck - third prize.");
        break;
     default:
        printf("Too bad, you lose.");
}

使用枚舉類型的變量控制switch

<!-- lang: cpp -->

enum Weekday {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}today = Wednesday;
switch(today){
    case Sunday:
        printf("Today is Sunday");
        break;
    case Monday:
        printf("Today is Monday");
        break;
    case Tuesday:
        printf("Today is Tuesday");
        break;
    case Wednesday:
        printf("Today is Wednesday");
        break;
    case Thursday:
        printf("Today is Thursday");
        break;
    case Friday:
        printf("Today is Friday");
        break;
    case Saturday:
        printf("Today is Saturday");
        break;
    case Sunday:
        printf("Today is Sunday");
        break;
    default:
        printf("today is a Invalid value!");
}

再看一個例子:

<!-- lang: cpp -->

int main()
{
   char ch = 0;
   printf("please input a char type letter:\n");
   scanf("%c",&ch);
   //isalpha()函數用來判斷char字符是否是一個字母,若是是就返回true,不然返回false
   //因此if語句中的!isalpha()函數的意思是
   //若是傳入的不是一個字母就爲true,就執行if語句塊中的語句,不然就執行else語句中的代碼
   if(!isalpha(ch)){
        printf("The character is not a letter.\n");
   } else {
        switch(tolower(ch)){
            case 'a': case 'e': case 'i': case 'o': case 'u':
                printf("The character is a vowel.\n");
                break;
            default:
                printf("The character is a consonant.\n");
        }
   }
   return 0;
}

###測試字符

下面是一些字符類型的比較 'Z' >= 'A' 結果爲true,由於Z=90,A=65 'Q' >= 'P'結果爲false,由於P在Q的前面 'B' <= 'b'結果爲true,由於小寫字母比對應的大寫字母大32 'B' != 66結果爲false,B的十進制值爲66

代碼示例:將大寫字母轉換爲小寫字母

<!-- lang: cpp -->

#include <stdio.h>

/*
    下面的判斷還能夠寫的更加嚴謹,可是這裏只是簡單看一個例子
    字符的大小寫轉換也可使用標準庫頭文件<ctype.h>中的toupper()和tolower()函數
*/
int main(void) {
    char letter = 0;
    
    printf("Enter an uppercase letter:");
    scanf("%c", &letter);
    
    if(letter >= 'A') {
        if(letter <= 'Z') {
            //下面是把大寫字母轉換爲小寫字母的方法,適用於全部大寫字母,可是隻能用於ASCII編碼
            letter-= 'A' + 'a';    
            printf("You entered an uppercase %c\n", letter);
        } else {
            printf("Try using the shift key! I want a capital letter.\n",);
        }
    } else {
        printf("You didn't enter a letter\n");
    }
    return 0;
}

###邏輯運算符

有時候執行一個測試不足以作出判斷,而須要合併兩個或多個檢查,若是這些條件都是true,才執行某個操做

####邏輯與運算符&& 它合併兩個邏輯表達式,即兩個表達式的值都爲true或false的表達式 例如:test1 && test2這個邏輯表達式,當test1和test2都爲true才爲true,有一個false此表達式就爲false

代碼示例:

<!-- lang: cpp -->

//當a的值大於5而且小於20的時候,也就是6~19之間,打印"5<a<20"
int a =10;
if(a > 5 && a < 20) {
    printf("5<a<20");
}

//與上面實際上是一個道理,只不過把邏輯表達式存儲到了布爾變量中,一樣if表達式中兩個都爲true時,才執行輸出語句
bool test1  = a > 5;
bool test2  = a < 20;
if(test1 && test2) {
    printf("5<a<20");
}

####邏輯或運算||

邏輯或運算符||用於兩個或多個條件爲true的情形 若是運算符||的一個或兩個操做數是true,結果就是true 只有所有操做數都是false,結果纔是false ||或運算符的單個例子就不在這舉例子了,舉一個&&||共存的例子吧

代碼示例:

<!-- lang: cpp -->
//下面2大塊表達式中的第一個表達式是而且的關係,因此都要都爲true,結果纔是true
//不過因爲2大塊表達式的關係是或者,2大塊表達式中的一個爲true就能夠執行輸出語句
if((age >12 && age < 20) || savings > 5000) {
    printf("Either you're a teenager, or you're rich, or possibly both.");
}

####邏輯非!運算符

!運算符是一元運算符,由於它只有一個操做數 它起到翻轉邏輯表達式的值,使true變成falsefalse變成true 儘可能避免使用這個運算符,它使代碼難以理解 下面只給出一個示例,不過多說明了

代碼示例:

<!-- lang: cpp -->
    
if((!(age <= 12) && !(age >= 20)) || !(savings <= 5000)) {
    printf("Something do it...");
}

####條件運算符

條件運算符根據一個邏輯表式等於true仍是false,執行兩個表達式中的一個 因爲涉及三個操做數:一個邏輯表達式和另外兩個表達式,所以也稱爲三元運算符,或三目運算符 condition ? expression1 : expression2 若是condition爲true,則執行expression1,不然執行expression2

代碼示例:

<!-- lang: cpp -->

x = y > 7 ? 25 : 50;

//至關於下面if判斷語句
if(y > 7) x = 25;
else x = 50;

較爲複雜的三元運算代碼示例:

<!-- lang: cpp -->

int main()
{
    const double unit_price = 3.50; //單價
    const double discount1 = 0.05;  //折扣1
    const double discount2 = 0.1;   //折扣2
    const double discount3 = 0.15;  //折扣3
    double total_price = 0.0;       //總價
    int quantity = 0;               //數量

    //提示用戶輸入一個購買數量,此處我輸入了60
    printf("Enter the number that you want to buy:");
    scanf(" %d",&quantity);

    //下面的運算,根據用戶輸入的購買數量後通過打折後計算的總價
    //首先,因爲上面我輸入了60,也就是quantity=60
    //因此符合>50的表達式,經過閱讀條件,如今表達式變成了下面的樣子
    //total_price = quantity * unit_price * 
    //               (1.0 - (quantity > 50 ? discount3 : something-else));
    //quantity > 50表達式成立,因此又變成了下面這樣
    //total_price = quantity * unit_price * (1.0 - discount3);
    //total_price = 60 * 3.50 * (1.0 - 0.15);
    //total_price = 60 * 3.50 * 0.85;   60(int類型)隱式轉換爲double類型再進行乘法計算
    //total_price = 178.50  這就是整個的運算順序
    total_price = quantity * unit_price * (1.0 - (quantity > 50 ? discount3 :
                                                 (quantity > 20 ? discount2 :
                                                 (quantity > 10 ? discount1 : 0.0))));
    //輸出總價
    printf("The price for %d is $%.2lf\n",quantity,total_price);

    return 0;
}

###運算符的優先級

運算符的優先級肯定了表達式中運算符的執行順序,以下所示:

代碼示例:

<!-- lang: cpp -->

//下面的表達式的含義爲,求職者必須年齡大於等於25而且是哈佛大學畢業,或者是耶魯大學畢業
Age >= 25 && Harvard || Yale;
//上面的語句至關於下面的語句,若是不知道運算符的優先級,加上括號也是無害的,由於()的運算符級別是最高的
(Age >= 25 && Harvard) || Yale;    //&&的運算級別高於||,因此加上括號也是同樣的

//若是要是要求耶魯大學畢業而且年齡也要大於等於25,就要改爲下面這樣,用括號括起來,改變運算的執行順序
//天然語意也就發生了改變
Age >= 25 && (Harvard || Yale);

下面的圖片表示了C語言中的運算符運算級別 C語言運算符級別

結合上圖能夠簡單總結一下基本的順序: 二元算術運算符 > 比較運算符 > 二元邏輯運算符 所以,先執行算術運算,再進行比較,以後執行邏輯操做 賦值符號=是列表中最後一個,因此它們在其餘運算都完成後執行 注意!運算符在邏輯運算符中的優先級別最高,所以,翻轉邏輯表達式的值時,邏輯表達式外面的括號是必需的

###按位運算符

按位運算符有6個,他們操做的是整數值中的位 這些位運算符都只能用於整數類型,其中除了~運算符是一元運算符,只處理一個操做數,其他都是二元運算符 它們以下所示:

  • & 按位與運算符
  • | 按位或運算符
  • ^ 按位異或(EOR)運算符
  • ~ 按位非運算符,也稱爲1的補位運算符
  • << 按位左移運算符
  • >> 按位右移運算符

####按位與運算符& 若是兩個數的二進制某位都是1,結果位就是1,不然,結果位就是0

<!-- lang: cpp -->

//計算過程以下
//x        0 0 0 0 1 1 0 1
//y        0 0 0 0 0 1 1 0
//x&y    0 0 0 0 0 1 0 0    因此z等於4
int x = 13;
int y = 6;
int z = x & y;    //z = 4

####按位或運算符| 若是對應位中有一個或兩個位是1,按位或運算符|就生成1,不然就生成0

<!-- lang: cpp -->

//x        0 0 0 0 1 1 0 1
//y        0 0 0 0 0 1 1 0
//x|y     0 0 0 0 1 1 1 1    因此z等於15     
int z = x | y;    //z = 15

####按位異或運算符^ 若是兩個位是不一樣的,按位異或運算符^就生成1,不然就生成0

<!-- lang: cpp -->

//x        0 0 0 0 1 1 0 1
//y        0 0 0 0 0 1 1 0
//x|y     0 0 0 0 1 0 1 1    因此z等於11  
int z = x ^ y;    //z = 11

####按按位非運算符^ 也稱爲1的補位運算符,它會翻轉其操做數的爲,將1變爲0,0變爲1

<!-- lang: cpp -->
    
//x        0 0 0 0 1 1 0 1
//~x      1 1 1 1 0 0 1 0
int x = 13;
int z = ~x;    //z = -14

####按位左移運算符<< 按位左移運算符<<會把左操做數位移動右操做數指定的位數

<!-- lang: cpp -->

//value                        0 0 0 0 1 1 0 0
//value<<shiftcount    0 1 1 0 0 0 0 0    向左移了3位,因此等於96
int value = 12;
int shiftcount = 3;
int result = value << shiftcount;    //result = 96

####按位右移運算符>> 相對於左移,它較爲複雜,對於不帶符號的數值,向右移位時,會在左邊的空位中填充0

<!-- lang: cpp -->

//在2字節中value的二進制值爲:1111 1111 0101 1100
unsigned int value = 65372U;
//value中的位向右移動兩位,在左邊補入0,獲得的值存儲在result中
//在二進制中,其值爲0,在十進制中,其值爲16343
//0011 1111 1101 0111    
unsigned int result = value >> 2;
相關文章
相關標籤/搜索