天天看點

C++菜鳥學習筆記系列(14)——條件語句

C++菜鳥學習筆記系列(14)

本期主題:條件語句

和其他大多數語言類似的,C++語言也為我們提供了條件執行語句(if、switch)這些都是我們寫程式中最常見也是最常用的語句。在本期的部落格中我們就主要圍繞這兩個語句進行簡單的讨論。

在開始之前,我們先了解一下C++中語句的定義。

C++中存在簡單語句和複合語句,一般來說一條語句就是一個表達式以分号結束,這樣就變成了表達式語句。

例如:

val + 10;
           

當然上述代碼并沒有什麼實際效果,雖然執行了加法但是相加的結果并沒有被使用。

最簡單的語句是空語句,空語句就是一個單獨的分号(;)。如果我們在程式中的某個地方需要寫一條語句,但是這條語句又不需要做什麼事情,這時候就可以用空語句了。

例如:

while (cin >> val && val !=3)
		;
           

注意:對于分号的使用我們要記住不能漏寫分号(;)也最好别多寫分号(;)有的時候我們多寫分号并不會造成什麼文法錯誤,同時也不會導緻邏輯上的錯誤。

例如:

val = val + 10;;
           

這樣隻是相當于又加了一條空語句而已。但是如果我們出現這種情況呢?

int val = 0;
	while (val !=3);
		++ val;
           

這樣則會造成出現一個死循環,是以我們不要漏寫也最好不要多寫分号。

複合語句

複合語句就是指用花括号括起來的語句和聲明的序列,比如我們在使用while、for等循環語句的循環體通常是很多條語句,這時就需要用一個花括号把多條語句括起來(當然複合語句也可以為空的)。複合語句也被稱為塊。一個塊就是一個作用域(在其中定義的名字隻能在其内部及嵌套在塊中的子塊使用)。

言歸正傳,C++為我們提供了 if 、switch 兩個條件語句。其中if語句通過條件決定控制流,switch語句計算一個整型表達式的值,然後根據這個值從幾條執行語句中選一條進行計算。

(1)if語句

if語句的基本作用是通過判斷一個指定的條件是否為真,根據判斷的結果決定是否執行下面的語句,if語句還可以含有else分支。

例如最簡單的if語句形式:

if ( 條件為true)
	{
		執行語句1
	}
           

帶有else分支的形式:

if ( 條件為true)
	{
		執行語句1;
	}
	else
	{
		執行語句2;
	}
           

嵌套if語句,通過引出else分支這個概念我們可以想到,如果多個if…else語句是否可以套在一起使用呢?答案是肯定的,我們可以通過嵌套if語句來表達我們的多個判斷條件,下面我們來看一個小例子:

/*
author:wxc_1998
date:2018/10/21
*/

#include <iostream>
#include <vector>
#include <string>

using namespace std;

void main()
{
	string score = "FDCBA";

	int grade = 0;
	cout << "please input the grade of you: " << endl;
	cin >> grade;
	string level = "";
	if(grade < 60)
	{
		level = score[0];
	}
	else
	{
		if (grade != 100)
		{
			level = score[(grade - 50) / 10];
			if (grade % 10 > 7)
			level += "+";
			else if (grade % 10 < 3)
				level += "-";
		}
		else
			level = "A++";
	}

	cout << "the level of you grade is: " << level;

	cout << endl << "press any key to continue!";
  	cin.clear();
  	cin.sync();
  	cin.get();
}
           

在上述代碼中我們通過對嵌套if語句的使用實作了對處于不同分數段的成績進行了分類。

注意:

(1)我們在使用嵌套if語句時要特别注意else分支和if語句間的比對是否正确,這是一個“懸垂else”的問題,當if分支的數量多于else分支時,else分支會自動的和最近的尚未比對的if配對,而不能簡單的根據程式的縮進形式進行判讀。當我們想避免這種情況的出現時,我們可以使用花括号來控制執行的路徑,例如把最近的if語句放進括号内部,那麼它就不能和外部的else比對了。

(2)我們最好不要用if…else進行多次嵌套,這樣可能會導緻我們自己的邏輯比較混亂,使自己寫的程式不夠整潔

(2)switch語句

switch語句為我們提供了一個便利的途徑使得我們能夠從若幹固定項中做出選擇。我們先看一個比較典型的例子:

/*
author:wxc_1998
date:2018/10/21
*/

#include <iostream>

using namespace std;

void main()
{
	int i , count[10] = {0}, other_count = 0;
	cout << "please input a integer(0 - 9): " << endl;
	while (cin >> i)
	{
		switch(i) 
		{
		case 0:
			++ count[0];
			break;
		case 1:
			++ count[1];
			break;
		case 2:
			++ count[2];
			break;
		case 3:
			++ count[3];
			break;
		case 4:
			++ count[4];
			break;
		case 5:
			++ count[5];
			break;
		case 6:
			++ count[6];
			break;
		case 7:
			++ count[7];
			break;
		case 8:
			++ count[8];
			break;
		case 9:
			++ count[9];
			break;
		}
	}
	for (int j = 0; j != 9 ; ++j)
	{
		cout << j << "appeared " << count[j] << " times!" << endl;
	}
	cout << "out of range number appeared : " << other_count << " times!" << endl;
	cout << endl << "press any key to continue!";
	cin.clear();
  	cin.sync();
  	cin.get();
}
           

在上述代碼中switch語句先對括号内的表達式求值(這裡就是i的值)并轉化為整數類型,然後與後續每個case标簽的值比較。如果某個case标簽的值和其比對成功,那麼則執行該标簽後的語句直到遇到break為止。如果沒有case标簽與其相比對,那麼則會一直運作到switch語句結束。

遇到break語句和運作到switch語句結束都會退出switch語句的控制權到外部的語句(這裡就是到while語句的條件部分)。

注意:一般來說我們習慣性的在每個case标簽後都加上上一個break;語句,但是如果程式要求我們不能加break;語句那麼我們也可以不加。此時我們要了解我們如果沒有加break;語句那麼在比對了case标簽後會一直執行直到遇到break;。

例如上述代碼中我們改成:

while (cin >> i)
	{
		switch(i) 
		{
		case 0:
		case 1:;
		case 2:
		case 3:
		case 4:
		case 5:
		case 6:
		case 7:
		case 8:
		case 9:
			++ count[9];
			break;
		}
	}
           

我們輸入0-9之間的任意一個整數,count[9]的值都會加1。

一般來說,除非必要,我們最好不要省略break;

default标簽

我們在前面說如果沒有任何case标簽比對成功,那麼到達switch結尾處會直接跳出switch控制。但是還有一個情況就是我們想讓其在沒有找到case标簽配對時還能夠執行一定的語句,那麼我們應該怎麼辦呢?C++語言中為我們提供了default語句供我們使用,當所有的case标簽都沒有比對時則執行default語句後的表達式。

例如我們在上述程式中輸入了0-9以外的整數,那麼所有的case标簽都不能比對成功,我們還想要統計一下有多少整數在0-9之外,那麼我們隻需在switch後加上:

default:
			++ other_count;
			break;
           

當然如果我們不需要程式在沒有配對到case标簽做什麼事情時,也可以不添加default标簽。

關于switch語句我們就介紹這麼多,下面我再寫兩個我們在寫程式時易犯得錯誤。

(1)case标簽後的值一個要是一個常量(加const或者直接用字面值)。

(2)一個case标簽就是一個塊,一個域,我們最好不要在case标簽後使用定義語句,雖然這樣不會出現什麼文法錯誤,但是這個域太小了,我們在這裡定義了一個變量隻能在這個case标簽中用,下一個case中就不能使用更不要說switch語句外的區域了。

好了,這次就寫到這裡了,我們下次再見!

注:雖然這篇部落格的内容十分簡單,但是大家若有轉載還請标明出處!

繼續閱讀