###算術比較 下面列出了兩個操做數用於比較的算術比較運算符express
它們的運算結果會獲得int類型的值,若是爲真則結果爲1,若是爲假結果爲0 這些表達式稱爲邏輯表達式或者布爾表達式,由於每一個表達式都會等到兩個結果之一:
true
或false
api
<
左操做數小於右操做數<=
左操做數小於等於右操做數==
左操做數等於右操做數!=
左操做數不等於右操做數>
左操做數大於右操做數>=
左操做數大於等於右操做數###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
表達式,直到找到一個結果爲true
的if
表達式爲止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
變成false
,false
變成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語言中的運算符運算級別
結合上圖能夠簡單總結一下基本的順序: 二元算術運算符 > 比較運算符 > 二元邏輯運算符 所以,先執行算術運算,再進行比較,以後執行邏輯操做 賦值符號
=
是列表中最後一個,因此它們在其餘運算都完成後執行 注意!
運算符在邏輯運算符中的優先級別最高,所以,翻轉邏輯表達式的值時,邏輯表達式外面的括號是必需的
###按位運算符
按位運算符有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;