亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

<展現C#> 第六章 控制語句

2019-11-18 22:06:58
字體:
來源:轉載
供稿:網友
第六章   控制語句

    有一種語句,你在每種編程語言控制流程語句中都可以找到。在這一章中,我介紹了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++中一樣??匆韵掠杏玫膶Ρ炔僮鞣ǖ⒉皇撬械臄祿愋投加行В?br>  ==  ——如果兩個值相同,返回真。
  !=   ——如果兩個值不同,返回假。
<, <=, >, >=  —— 如果滿足了關系(小于、小于或等于、大于、大于或等于),返回真。
    每個操作符是通過重載操作符被執行的,而且這種執行對數據類型有規定。如果你比較兩個不同的類型,對于編譯
器,必須存在著一個隱式的轉換,以便自動地創建必要的代碼。但是,你可以執行一個顯式的類型轉換。
     清單 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語段為止。盡管有時這是一個強大的功能,但它更經常地產生難于發現的缺陷。
     可如果你想執行其它case標簽的代碼,那怎么辦? 有一種辦法,它顯示于清單6.3中。

清單 6.3 在swtich語句中使用 goto 標簽 和 goto default

1: using System;
2:
3: class SwitchApp
4: {
5:  public static void Main()
6:  {
7:   Random objRandom = new Random();
8:   double dRndNumber = objRandom.NextDouble();
9:   int nRndNumber = (int)(dRndNumber * 10.0);
10:
11:   switch (nRndNumber)
12:   {
13:    case 1:
14:     //什么也不做
15:     break;
16:    case 2:
17:     goto case 3;
18:    case 3:
19:     Console.WriteLine("Handler for 2 and 3");
20:     break;
21:    case 4:
22:     goto default;
23:     // everything beyond a goto will be warned as
24:     // unreachable code
25:    default:
26:     Console.WriteLine("Random number {0}", nRndNumber);
27:   }
28:  }
29: }

 在這個例子中,通過Random類產生用于控制表達式的值(第7~9行)。switch語段包含兩個對switch語句有效的跳轉
語句。
  goto case  標簽:跳轉到所說明的標簽
  goto default: 跳轉到 default 標簽
  有了這兩個跳轉語句,你可以創建同C一樣的功能,但是,直達不再是自動的。你必須明確地請求它。
  不再使用直達功能的更深的含義為:你可任意排列標簽,如把default標簽放在其它所有標簽的前面。為了說明它,我
創建了一個例子,故意不結束循環:

switch (nSomething)
{
default:
case 5:
  goto default;
}

  我已經保留了其中一個swich 語句功能的討論直至結束——事實上你可以使用字符串作為常量表達式。這對于VB程序
員,可能聽起來不象是什么大的新聞,但來自C或C++的程序員將會喜歡這個新功能。
         現在,一個 switch 語句可以如以下所示檢查字符串常量了。

string strTest = "Chris";
switch (strTest)
{
case "Chris":
  Console.WriteLine("Hello Chris!");
  break;
}
  
         
6.2  循環語句
  當你想重復執行某些語句或語段時,依據當前不同的任務,C#提供4個不同的循環語句選擇給你使用:
。 for 語句
。foreach 語句
。 while 語句
。do 語句

6.2.1 for 語句
  當你預先知道一個內含語句應要執行多少次時,for 語句特別有用。當條件為真時,常規語法允許重復地執行內含語
句(和循環表達式):
    for (初始化;條件;循環)  內含語句
   請注意,初始化、條件和循環都是可選的。如果忽略了條件,你就可以產生一個死循環,要用到跳轉語句(break 或
goto)才能退出。

for (;;)
{
break; // 由于某些原因
}


    另外一個重點是,你可以同時加入多條由逗號隔開的語句到for循環的所有三個參數。例如,你可以初始化兩個變量、
擁有三個條件語句,并重復4個變量。
    作為C或C++程序員,你必須了解僅有的一個變化:條件語句必須為布爾表達式,就象 if 語句一樣。
    清單6.4 包含使用 for 語句的一個例子。它顯示了如何計算一個階乘,比使用遞歸函數調用還要快。

清單 6.4  在for 循環里計算一個階乘

1: using System;
2:
3: class Factorial
4: {
5:  public static void Main(string[] args)
6:  {
7:   long nFactorial = 1;
8:   long nComputeTo = Int64.Parse(args[0]);
9:
10:   long nCurDig = 1;
11:   for (nCurDig=1;nCurDig <= nComputeTo; nCurDig++)
12:    nFactorial *= nCurDig;
13:
14:   Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);
15:  }
16: }

         盡管該例子過于拖沓,但它作為如何使用for 語句的一個開端。首先,我本應在初始化內部聲明變量nCurDig:
for (long nCurDig=1;nCurDig <= nComputeTo; nCurDig++) nFactorial *= nCurDig;
    另一種忽略初始化的選擇如下行,因為第10行在for 語句的外部初始化了變量。(記住C#需要初始化變量):
for (;nCurDig <= nComputeTo; nCurDig++) nFactorial *= nCurDig;
    另一種改變是把++操作符移到內含語句中:
for ( ;nCurDig <= nComputeTo; ) nFactorial *= nCurDig++;
    如果我也想擺脫條件語句,全部要做的是增加一條if 語句,用break 語句中止循環:

for (;;)
{
if (nCurDig > nComputeTo) break;
nFactorial *= nCurDig++;
}


    除了用于退出for語句的break語句外,你還可以用continue 跳過當前循環,并繼續下一次循環。
for (;nCurDig <= nComputeTo;)
{
if (5 == nCurDig) continue; // 這行跳過了余下的代碼
nFactorial *= nCurDig++;

}

6.2.2 foreach 語句
    已經在Visual Basic 語言中存在了很久的一個功能是,通過使用For Each 語句收集枚舉。C#通過foreach 語句,也
有一個用來收集枚舉的命令:
foreach(表達式中的類型標識符) 內含語句
    循環變量由類型和標識符聲明,且表達式與收集相對應。循環變量代表循環正在為之運行的收集元素。

    你應該知道不能賦一個新值給循環變量,也不能把它當作ref 或out 參數。這樣引用在內含語句中被執行的代碼。

    你如何說出某些類支持foreach 語句? 簡而言之,類必須支持具有 GetEnumerator()名字的方法,而且由其所返回的
結構、類或者接口必須具有public 方法MoveNext() 和public 屬性Current。如果你想知道更多,請閱讀語言參考手冊,
它有很多關于這個話題的詳細內容。

    對于清單 6.5 中的例子,我恰好偶然選了一個類,實現了所有這些需要。我用它來列舉被定義過的所有的環境變量。

清單 6.5   讀所有的環境變量

1: using System;
2: using System.Collections;
3:
4: class EnvironmentDumpApp
5: {
6:  public static void Main()
7:  {
8:   IDictionary envvars = Environment.GetEnvironmentVariables();
9:   Console.WriteLine("There are {0} environment variables declared", envvars.Keys.Count);
10:   foreach (String strKey in envvars.Keys)
11:   {
12:    Console.WriteLine("{0} = {1}",strKey, envvars[strKey].ToString());
13:   }
14:  }
15: }
    對GetEnvironmentVariables的調用返回一個IDictionary類型接口,它是由.NET框架中的許多類實現了的字典接口。
通過 IDictionary 接口,可以訪問兩個收集:Keys   和 Values。在這個例子里,我在foreach語句中使用Keys,接著查
找基于當前key值的值(第12行)。
     當使用foreach時,只要注意一個問題:當確定循環變量的類型時,應該格外小心。選擇錯誤的類型并沒有受到編譯
器的檢測,但它會在運行時受檢測,且會引發一個異常。

6.2.3 while 語句
    當你想執行一個內含語句0次或更多次時,while語句正是你所盼望的:

while (條件)  內含語句

    條件語句——它也是一個布爾表達式 ——控制內含語句被執行的次數。你可以使用 break 和continue語句來控制
while語句中的執行語句,它的運行方式同在for語句中的完全相同。
    為了舉例while的用法,清單 6.6 說明如何使用一個 StreamReader類輸出C#源文件到屏幕。

清單  6.6  顯示一個文件的內容

1: using System;
2: using System.IO;
3:
4: class WhileDemoApp
5: {
6:  public static void Main()
7:  {
8:   StreamReader sr = File.OpenText ("whilesample.cs");
9:   String strLine = null;
10:
11:   while (null != (strLine = sr.ReadLine()))
12:   {
13:     Console.WriteLine(strLine);
14:   }
15:
16:   sr.Close();
17:  }
18: }


     代碼打開文件 whilesample.cs, 接著當ReadLine 方法返回一個不等于null的值時,就在屏幕上顯示所讀取的值。注
意,我在while條件語句中用到一個賦值。如果有更多的用&&和&brvbar;&brvbar;連接起來的條件語句,我不能保證它們是
否會被執行,因為存在著“短路”的可能。

6.2.4  do 語句
    C#最后可利用的循環語句是do語句。它與while語句十分相似,僅當經過最初的循環之后,條件才被驗證。


do
{
內含語句
}
while (條件);

    do語句保證內含語句至少被執行過一次,而且只要條件求值等于真,它們繼續被執行。通過使用break語句,你可以迫
使運行退出 do 語塊。如果你想跳過這一次循環,使用continue語句。
    一個如何使用do語句的例子顯示在清單 6.7中。它向用戶請求一個或多個數字,并且當執行程序退出do循環后計算平
均值。

清單  6.7  在do 循環中計算平均值

1: using System;
2:
3: class ComputeAverageApp
4: {
5:  public static void Main()
6:  {
7:   ComputeAverageApp theApp = new ComputeAverageApp();
8:   theApp.Run();
9:  }
10:
11:  public void Run()
12:  {
13:   double dValue = 0;
14:   double dSum = 0;
15:   int nNoOfValues = 0;
16:   char chContinue = 'y';
17:   string strInput;
18:
19:   do
20:   {
21:    Console.Write("Enter a value: ");
22:    strInput = Console.ReadLine();
23:    dValue = Double.Parse(strInput);
24:    dSum += dValue;
25:    nNoOfValues++;
26:    Console.Write("Read another value?");
27:    
28:    strInput = Console.ReadLine();
29:    chContinue = Char.FromString(strInput);
30:   }
31:   while ('y' == chContinue);
32:
33:   Console.WriteLine("The average is {0}",dSum / nNoOfValues);
34:  }
35: }

    在這個例子里,我在靜態 Main函數中實例化 ComputeAverageApp類型的一個對象。它同樣接著調用實例的Run方法,
該方法包含了計算平均值所有必要的功能。
    do 循環跨越第19~31行。條件是這樣設定的:分別回答各個問題 “y”,以決定是否要增加另一個值。輸入任何其它
字符會引起程序退出 do語塊,且平均值被計算。
     正如你可以從提到的例子看出,do語句和while語句差別不太大——僅有的差別就是條件在什么時候被求值。

6.3 小結
    這章解釋了如何使用C#中用到的各種選擇和循環語句。 if 語句在應用程序中可能是最為常用的語句。當在布爾表達
式中使用計算時,編譯器會為你留意。但是,你一定要確保條件語句的短路不會阻止必要代碼的運行。
    switch 語句——盡管同樣與C語言的相應部分相似——但也被改善了。直達不再被支持,而且你可以使用字符串標
簽,對于C程序員,這是一種新的用法。
    在這一章的最后部分,我說明如何使用for、foreach、while和do語句。語句完成各種需要,包括執行固定次數的循
環、列舉收集元素和執行基于某些條件的任意次數的語句。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲免费电影| 欧美乱人伦中文字幕在线| 亚洲欧美一区二区三区四区| 亚洲一区二区三区视频播放| 国产午夜精品美女视频明星a级| 欧美怡红院视频一区二区三区| 国产亚洲欧美另类中文| 一本色道久久88综合亚洲精品ⅰ| 国产精品一区二区三区在线播放| 亚洲精品自拍第一页| 欧美一区三区三区高中清蜜桃| 久久久综合av| 精品福利樱桃av导航| 久久精品中文字幕一区| 久久99精品久久久久久琪琪| 欧美有码在线观看| 成人性生交xxxxx网站| 国产精品九九久久久久久久| 精品亚洲aⅴ在线观看| 久久亚洲成人精品| 久久久久久亚洲精品不卡| 国产日韩一区在线| 国模精品系列视频| 日韩大片免费观看视频播放| 欧美在线一区二区视频| 97在线视频观看| 欧美一级片在线播放| 国产婷婷成人久久av免费高清| 国产视频亚洲视频| 欧美性猛交丰臀xxxxx网站| 91久久久在线| 亚洲欧美精品中文字幕在线| 国产日产欧美a一级在线| 国产亚洲欧美另类中文| 亚洲free性xxxx护士白浆| 国产不卡在线观看| 国产不卡在线观看| 中文字幕欧美精品日韩中文字幕| 亚洲无线码在线一区观看| 77777少妇光屁股久久一区| 亚洲自拍偷拍色片视频| 国产日本欧美视频| 亚洲精品成人网| 亚洲性日韩精品一区二区| 久久久久久网站| 日韩中文字幕在线| 91久久精品美女| 日韩专区在线观看| 国产精品精品久久久久久| 欧美性猛xxx| 亚洲男女自偷自拍图片另类| 久久99国产精品久久久久久久久| 91免费版网站入口| 91在线视频精品| 国产精品免费一区二区三区都可以| 欧美成aaa人片在线观看蜜臀| 欧美大全免费观看电视剧大泉洋| 欧美特黄级在线| 亚洲免费福利视频| 中文字幕免费精品一区高清| 国产性色av一区二区| 欧美黑人巨大精品一区二区| 国产精品观看在线亚洲人成网| 91欧美日韩一区| 26uuu亚洲国产精品| 7m第一福利500精品视频| 国产91热爆ts人妖在线| 欧美xxxx18国产| 欧美xxxx18性欧美| 国产精品一区二区三区久久久| 国产精品对白刺激| 日韩国产一区三区| 91国内精品久久| 亚洲国产精品久久精品怡红院| 国产91在线视频| 精品国产31久久久久久| 欧美精品精品精品精品免费| 国产成人精品久久二区二区| 欧美中文字幕在线播放| 中文字幕在线看视频国产欧美在线看完整| 成人h片在线播放免费网站| 久久久久久12| 成人精品一区二区三区| 亚洲人线精品午夜| 精品一区二区三区电影| 国产精品美女网站| 亚洲嫩模很污视频| 久久久999国产| 国产狼人综合免费视频| 91精品国产91久久久久| 亚洲精品久久久一区二区三区| 久久久91精品| 亚洲色图美腿丝袜| 中文字幕亚洲精品| 精品国产乱码久久久久久婷婷| 欧美人与物videos| 欧美日韩性视频| 91在线中文字幕| 日韩有码在线播放| 久久亚洲精品一区二区| 92看片淫黄大片看国产片| 国产精品免费一区| 国产日韩在线看片| 成人免费视频网址| 中文字幕亚洲欧美| 欧美精品videosex牲欧美| 欧美高清在线视频观看不卡| 国产视频精品免费播放| 久久黄色av网站| 欧美激情xxxxx| 欧美限制级电影在线观看| 久久这里有精品视频| 91亚洲国产精品| 性色av香蕉一区二区| 中文字幕亚洲欧美| 亚洲福利视频网站| 亚洲免费av片| 亚洲自拍偷拍一区| 欧美午夜精品久久久久久久| 成人精品视频99在线观看免费| 欧美福利视频在线观看| 免费91麻豆精品国产自产在线观看| 成人a在线视频| 日韩高清免费在线| 深夜精品寂寞黄网站在线观看| 国产日本欧美视频| 在线观看日韩专区| 亚洲精品久久久久久下一站| 国产91av在线| 亚洲国产精品久久精品怡红院| 日韩av在线免费播放| 91国偷自产一区二区三区的观看方式| 亚洲91精品在线观看| 欧美一级高清免费播放| 亚洲精品视频免费在线观看| 欧美电影在线免费观看网站| 欧美日韩国产区| 5566日本婷婷色中文字幕97| 久久久噜久噜久久综合| 日韩中文字幕在线看| 77777少妇光屁股久久一区| 91精品久久久久久| 国产综合久久久久久| 国产婷婷成人久久av免费高清| 亚洲肉体裸体xxxx137| 最新的欧美黄色| 日韩美女视频中文字幕| 亚洲自拍另类欧美丝袜| 国产日韩欧美视频在线| 亚洲国产精久久久久久| 92国产精品久久久久首页| 成人美女免费网站视频| 久久久在线免费观看| 国产精品mp4| 亚洲福利视频久久| 91高潮精品免费porn| 亚洲激情在线视频| 亚洲电影av在线| 欧美性xxxxx| 日韩av在线免费观看一区| 亚洲人成在线观看网站高清| 国产日韩一区在线| 国产91网红主播在线观看| 57pao成人国产永久免费|