“老師,我這次四級考試過了沒有?”
如果老師被問到這個問題,他會如何回答?是的,他會根據不同的條件選擇不同的回答:
如果考試成績大於等於60,那就回答:“恭喜你,你通過了這次考試”;
否則那就回答“很遺憾,你沒有通過這次考試”。
這就是現實世界中的條件選擇——根據不同的條件做出不同的動作。那麼,在C++程序中,我們又該如何表達這種條件選擇呢?
在現實世界中,我們總是用“如果……,就……”的句式來表達條件選擇,C++也向我們學習,提供了if(如果)關鍵字來形成條件選擇結構,用以表達現實世界中的條件選擇,其語法格式如下:
if ( 條件表達式 ) { 語句1; } else { 語句2; }
C++在執行if條件選擇語句時,首先會計算其中條件表達式的值,然後根據其值的不同選擇執行不同的代碼。如果條件表達式的值為true,則直接向下執行語句1;反之,則進入else分支執行語句2。通過使用條件選擇語句,可根據條件表達式的不同值而改變程序執行的路徑,可以在語句1和語句2中實現不同的功能,從而達到“根據不同的條件執行不同的動作”的目的。if語句的執行過程如圖4-1所示。
現在,就可以用if語句來解決上面這個“四級考試過了沒有”的現實問題:
// 以考試成績作為條件 int nScore = 0; cout<<"請輸入考試成績:"; // 輸入考試成績 cin>>nScore; // 對條件表達式進行計算,判斷考試成績是否符合條件(大於等於60) // 如果nScore的值大於等於60,符合條件,條件表達式的值為true, // 則直接進入if分支執行,輸出考試通過的提示 if(nScore >= 85) { // 執行符合條件的動作 cout<<"恭喜你,你通過了這次考試"<<endl; } else // 如果不符合條件,條件表達式的值為false,則進入else分支執行 { // 執行不符合條件的動作 cout<<"很遺憾,你沒有通過這次考試"<<endl; }
圖4-1 條件選擇結構的執行流程
在這裡,首先讓用戶輸入考試成績,然後在if語句的條件表達式中,將其跟一個標准值進行比較,也就是判斷考試成績是否符合條件。如果考試成績大於等於60,則條件表達式的值為true,這就意味著符合條件,程序會進入if分支執行,輸出考試通過的提示語言。反之,如果考試成績小於60,條件不能滿足,條件表達式的值為false,程序則會進入else分支執行,輸出考試沒有通過的提示語。這樣就讓程序根據不同的條件(nScore大於等於60與否)做出了不同的動作(輸出不同的提示語)。
if語句的形式雖然簡單,但是在其使用上有如下幾個需要注意的地方。
很多時候,我們只關心條件為true時的情況,只對符合條件的情況進行處理,這時就可以省略else分支,僅保留if對條件表達式進行判斷以及其後的語句1對符合條件的情況進行處理。例如,我們只對通過考試的人進行提示,而對於沒有通過考試的人的,則直接忽略,用if語句表達出來就是:
// 省略else分支,只對符合條件的情況進行處理 if( nScore >= 60 ) { cout<<"恭喜你,你通過了這次考試"; }
2. if語句可以嵌套以表達多層次的條件判斷
在一個if語句中可以嵌套另一個if語句,表示在某個前提條件下做進一步的條件判斷,從而表達多層次的條件判斷。例如,要比較輸入的v1和v2兩個數的大小關系,我們需要先判斷兩者是否相等,在不相等的前提條件下,再繼續判斷兩者之間的大小關系,用嵌套的if語句將其表達出來就是:
cout << "請輸入兩個整數:" << endl; int v1, v2; // 獲取用戶輸入的數字 cin >> v1 >> v2; if( v1 != v2 ) // 判斷v1和v2是否相等,如果不相等,則繼續判斷大小 { // 第二級if語句 // 如果不相等,則繼續判斷v1是否大於v2 if( v1 > v2 ) // 大於 { cout<<" v1 > v2 "<<endl; } else // 小於 { cout<<" v1 < v2 "<<endl; } } else // v1和v2相等 { cout<<" v1 == v2 "<<endl; }
3. if語句可以並列
如果同一層次的條件有多種情況,就可以使用並列的條件選擇語句來實現。其語法格式如下:
if ( 條件表達式1 ) { 語句1; } else if ( 條件表達式2 ) { 語句2; } // … else if ( 條件表達式n ) { 語句n; } else { 語句n+1; }
在執行的時候,會首先計算條件表達式1的值,如果其值為true,則進入其分支執行語句1,然後結束整個並列條件選擇語句的執行;如果其值為false,則會繼續向下計算條件表達式2的值,同樣的,如果其值為true,則進入其分支執行語句2,然後結束整個語句,如果其值為false,則繼續向下進行同樣的計算過程。直到最後,如果所有的條件分支都無法滿足,則進入最後的else分支執行並結束整個語句。例如,我們在前面用嵌套的if語句實現的比較v1和v2的大小比較,實際上是三種相互並列的情況:要麼是大於,要麼是小於,要麼是等於。所以,同樣也可以用並列的條件結構來實現:
if(v1 > v2) // 首先判斷v1是否大於v2 { cout<<" v1 > v2"<<endl; } else if(v1 < v2) // 如果第一個條件不滿足,再判斷v1是否小於v2 { cout<<" v1 < v2"<<endl; } else // 如果v1既不大於v2,也不小於v2,那就必然是等於v2 { cout<<" v1 == v2"<<endl; }
這裡需要注意的是,並列條件語句在執行的時候,會逐個依次向下計算其中並列的條件表達式,直到某個條件表達式為true,然後才進入其分支執行並結束整個語句。所以,我們總是把滿足幾率比較高的條件判斷放在比較靠前的位置,希望if語句一開始就遇到滿足條件的分支,以避免對那些不易滿足的條件判斷的無用計算。
另外需要注意的是,並列條件選擇語句只會執行其中的某一個分支,如果多個條件表達式都為true,則只會執行從上到下遇到的第一個條件表達式為true的分支。例如:
int nScore = 91; if(nScore >= 60) // 第一個條件表達式為true,進入執行並直接結束整個語句 { cout<<"恭喜你,你通過了這次考試"<<endl; } // 因為第一個分支已經執行並結束了整個語句 // 所以即使第二個條件表達式也為true,但卻並不會得到執行 else if(nScore >= 85) { cout<<"厲害,你的成績是優秀"<<endl; }
所以在使用並列條件選擇語句時,應避免條件范圍的相互重復覆蓋,不要讓多個條件表達式同時為true,以免造成程序邏輯上的混亂。
知道更多:用“?:”條件操作符來表達條件判斷,簡化代碼
所謂條件操作符,它可以讓一個表達式根據不同的條件擁有不同的值。它是C++中唯一一個三元操作符,其語法格式如下:
條件表達式 ? 表達式1 : 表達式2
跟條件語句類似,在執行的時候,它會首先計算其中的條件表達式的值,如果其值為true,就會接著計算表達式1的值,並將其作為整個表達式的最終結果值。反之,則會計算表達式2的值,同樣作為整個表達式的最終結果值。
利用條件操作符,我們可以簡便地實現一些比較簡單的(要同時對條件成立和不成立的情況都進行處理,且處理的過程比較簡單)條件選擇的功能,從而達到簡化代碼的目的。例如,我們要從兩個數中選出較大的一個,使用if條件語句進行大小比較,可以實現為:
int a,b; // 輸入a,b… int m = 0; if(a > b) { m = a; } else { m = b; }
而如果是使用條件操作符,以上的條件選擇用一條語句就實現了:
int a,b; // 輸入a,b… int m = (a>b)?a:b;
在執行“(a>b)?a:b”的時候,同樣會先計算“(a>b)”的值,如果a的值比較大,也就是條件表達式的值為true,則會以第二個操作數a作為整個表達式的值,然後賦值給m。這樣,m就成了兩個數中較大的一個。反過來,如果b的值比較大,則條件表達式的值為false,就會以第三個操作數b作為整個表達式的值,最後賦值給m,此時m仍然是兩個數中較大的一個。由此可見,短短的一條語句就實現了原來需要整個if條件語句才能實現的功能。簡化代碼,就是條件操作符的最主要作用。