有時候編程編的久了,如果不停下來認真思考一下,即便是一些最基礎的知識點,也可能讓自己懵圈。其實,說到底還是打基礎的時候沒打牢,或者說自以為是地認為自己懂了,然后在打基礎的時候就懶得思考懶得看了,結果就是對這個基礎知識點的認識一直停留在自己的固有認識里。
好了,下面進入正題。if、else if和else是我們經常要用到的基本語法結構。某日,在園子里看到一博客貼出了這樣一個問題。
控制台輸入一個成績,如果 成績>=90 :輸出A,如果90>成績>=80 輸出B,如果80>成績>=70 輸出C ,如果70>成績>=60 輸出D,如果 成績<60輸出E。請思考用if好還是用if-else好還是if else if好,為什么好?
if的代碼實現如下:
if (score >= 90)
{
Console.WriteLine("A");
}
if (score >= 80)
{
Console.WriteLine("B");
}
if (score >= 70)
{
Console.WriteLine("C");
}
if (score >= 60)
{
Console.WriteLine("D");
}
if (score < 60)
{
Console.WriteLine("E");
}
if...else的代碼實現如下:
if (score >= 90)
{
Console.WriteLine("A");
}
else//<90
{
if (score >= 80)
{
Console.WriteLine("B");
}
else//<80
{
if (score >= 70)
{
Console.WriteLine("C");
}
else//<70
{
if (score >= 60)
{
Console.WriteLine("D");
}
else
{
Console.WriteLine("E");
}
}
}
}
if...else if的代碼實現如下:
if (score >= 90)
{
Console.WriteLine("A");
}
else if (score >= 80)
{
Console.WriteLine("B");
}
else if (score >= 70)
{
Console.WriteLine("C");
}
else if (score >= 60)
{
Console.WriteLine("D");
}
在公司做開發時,相信有不少人亂用這幾個結構。
我們首先看看if的實現,很明顯,各個if語句之間是獨立的,無論前面的if語句是否未真,當前if語句均會執行,顯然,這種實現效率低下。
再來看第二種和第三種實現,本質上,這兩種實現是等價的,在大多數編程語言實現中,else if都不是作為一種基本的關鍵字出現的,它實際是else語句和if語句的結合,這種組合構造避免了僅使用if、else時的多重嵌套,就像上面的第二種實現,類似於語法糖,便於程序員敲代碼。
另外,這種情形也可以使用switch...case結構實現。在C#中,當在整型常量上使用switch結構時,CLR總是會將switch翻譯為查找表結構,從而使得每個case分支都能獲得相同的執行時間,在這種情形下,相比使用if...else結構同時有一個值或者少量的幾個值出現的頻率明顯較高,那么使用if...else結構且將出現頻度較高的值排在前面的執行速度比switch結構會更快。
最后,C#中的switch...case結構還允許使用string常量,這和整型常量稍微不同。它在case標簽較少的情況下(大約是6個左右),switch語句將編譯成和if語句類似的結構。但是,如果case標簽數量足夠大(大於6個),那么c#編譯器將創建一個HashTable對象,用字符串常量填充它,然后在該表上進行查找,然后跳轉。Hashtable查找不是嚴格意義上的O(1),並且具有顯著的常量代價,但是若case標簽的數量足夠大,它的速度將比在多個if語句中比較字符串常量快。
