程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 第六章 控制語句

第六章 控制語句

編輯:C語言基礎知識
第六章   控制語句

    有一種語句,你在每種編程語言控制流程語句中都可以找到。在這一章中,我介紹了C#的控制語句,它們分為兩個主要部分:
。選擇語句
。循環語句
如果你是C或C++程序員,很多信息會讓你感到似曾相似;但是,你必須知道它們還存在著一些差別。
  
6.1 選擇語句
    當運用選擇語句時,你定義了一個控制語句,它的值控制了哪個語句被執行。在C#中用到兩個選擇語句:
。if  語句
。switch 語句

6.1.1  if  語句
    最先且最常用到的語句是 if  語句。內含語句是否被執行取決於布爾表達式:
    if (布爾表達式)   內含語句
    當然,也可以有else 分枝,當布爾表達式的值為假時,該分枝就被執行:
    if (布爾表達式)  內含語句   else    內含語句
    在執行某些語句之前就檢查一個非零長字符串的例子:

if (0 != strTest.Length)
{
}

    這是一個布爾表達式。(!=表示不等於。) 但是,如果你來自C或者C++,可能會習慣於編寫象這樣的代碼:
if (strTest.Length)
{
}

     這在C#中不再工作,因為 if  語句僅允許布爾( bool) 數據類型的結果,而字符串的Length屬性對象返回一個整
形(integer)。編譯器將出現以下錯誤信息:
error CS0029: Cannot implicitly convert type int to bool   (不能隱式地轉換類型 int  為 bool。)

    上邊是你必須改變的習慣,而下邊將不會再在 if 語句中出現賦值錯誤:
if (nMyValue = 5) ...

正確的代碼應為

if (nMyValue == 5) ...

    因為相等比較由==實行,就象在C和C++中一樣。看以下有用的對比操作符(但並不是所有的數據類型都有效):
  ==  ——如果兩個值相同,返回真。
  !=   ——如果兩個值不同,返回假。
<, <=, >, >=  —— 如果滿足了關系(小於、小於或等於、大於、大於或等於),返回真。
    每個操作符是通過重載操作符被執行的,而且這種執行對數據類型有規定。如果你比較兩個不同的類型,對於編譯
器,必須存在著一個隱式的轉換,以便自動地創建必要的代碼。但是,你可以執行一個顯式的類型轉換。
     清單 6.1  中的代碼演示了 if  語句的一些不同的使用場合,同時也演示了如何使用字符串數據類型。這個程序的
主要思想是,確定傳遞給應用程序的第一個參數是否以大寫字母、小寫字母或者數字開始。

清單  6.1   確定字符的形態

1: using System;
2:
3: class NestedIfApp
4: {
5:  public static int Main(string[] args)
6:  {
7:   if (args.Length != 1)
8:   {
9:    Console.WriteLine("Usage: one argument");
10:    return 1; // error level
11:   }
12:
13:   char chLetter = args[0][0];
14:
15:   if (chLetter >= A)
16:    if (chLetter <= Z)
17:    {
18:     Console.WriteLine("{0} is uppercase",chLetter);
19:     return 0;
20:    }
21:   
22:   chLetter = Char.FromString(args[0]);
23:   if (chLetter >= a && chLetter <= z)
24:    Console.WriteLine("{0} is lowercase",chLetter);
25:   
26:   if (Char.IsDigit((chLetter = args[0][0])))
27:    Console.WriteLine("{0} is a digit",chLetter);
28:      
29:   return 0;
30:  }
31: }

    始於第7行的第一個 if 語段檢測參數數組是否只有一個字符串。如果不滿足條件,程序就在屏幕上顯示用法信息,並
終止運行。
    可以采取多種方法從一個字符串中提取出單個字符——既可象第13行那樣利用字符索引,也可以使用Char類的靜態
FromString 方法,它返回字符串的第一個字符。
    第16~20行的 if 語句塊使用一個嵌套 的if 語句塊檢查大寫字母。用邏輯“與”操作符(&&)可以勝任小寫字母的
檢測,而最後通過使用Char類的靜態函數IsDigit,就可以完成對數字的檢測。
      除了“&&”操作符之外,還有另一個條件邏輯操作符,它就是代表“或”的“&brvbar;&brvbar;”。兩個邏輯操作
符都 是“短路”式的。對於“&&”操作符,意味著如果條件“與”表達式的第一個結果返回一個假值,余下的條件“與”
表達式就不會再被求值了。相對應,“&brvbar;&brvbar;”操作符當第一個真條件滿足時,它就“短路”了。
    我想讓大家理解的是,要減少計算時間,你應該把最有可能使求值“短路”的表達式放在前面。同樣你應該清楚,計
算 if 語句中的某些值會存在著替在的危險。

if (1 == 1 &brvbar;&brvbar; (5 == (strLength=str.Length)))
{
Console.WriteLine(strLength);
}

    當然,這是一個極其誇張的例子,但它說明了這樣的觀點:第一條語句求值為真,那麼第二條語句就不會被執行,它
使變量strLength維持原值。給大家一個忠告:決不要在具有條件邏輯操作符的 if 語句中賦值。

6.1.2  switch 語句
    和 if  語句相比,switch語句有一個控制表達式,而且內含語句按它們所關聯的控制表達式的常量運行。

switch (控制表達式)
{
case  常量表達式:
  內含語句
default:
  內含語句
}

    控制表達式所允許的數據類型 為: sbyte, byte, short, ushort, uint, long, ulong, char, string, 或者枚舉類
型。只要使其它不同數據類型能隱式轉換成上述的任何類型,用它作為控制表達式也很不錯。
    switch  語句接以下順序執行:
    1、控制表達式求值
    2、如果 case 標簽後的常量表達式符合控制語句所求出的值,內含語句被執行。
    3、如果沒有常量表達式符合控制語句,在default 標簽內的內含語句被執行。
    4、如果沒有一個符合case 標簽,且沒有default 標簽,控制轉向switch 語段的結束端。
    在繼續更詳細地探討switch語句之前,請看清單 6.2 ,它演示用 switch語句來顯示一個月的天數(忽略跨年度)
清單  6.2  使用switch語句顯示一個月的天數

1: using System;
2:
3: class FallThrough
4: {
5:  public static void Main(string[] args)
6:  {
7:   if (args.Length != 1) return;
8:
9:   int nMonth = Int32.Parse(args[0]);
10:   if (nMonth < 1 &brvbar;&brvbar; nMonth > 12) return;
11:   int nDays = 0;
12:
13:   switch (nMonth)
14:   {
15:    case 2: nDays = 28; break;
16:    case 4:
17:    case 6:
18:    case 9:
19:    case 11: nDays = 30; break;
20:    default: nDays = 31;
21:   }
22:   Console.WriteLine("{0} days in this month",nDays);
23:  }
24: }


    switch 語段包含於第13~21行。對於C程序員,這看起來非常相似,因為它不使用break語句。因此,存在著一個更具
生命力的重要差別。你必須加上一個break語句(或一個不同的跳轉語句),因為編譯器會提醒,不允許直達下一部分。
    何謂直達?在C(和C++)中,忽略break並且按以下編寫代碼是完全合法的:
nVar = 1
switch (nVar)
{
case 1:
  DoSomething();
case 2:
  DoMore();
}

    在這個例子中,在執行了第一個case語句的代碼後,將直接執行到其它case標簽的代碼,直到一個break語句退出
switch語段為止。盡管有時這是一個強大的功能,但它更經常地產生難於發現的缺陷。
     可如果你想執行其它
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved