C#教程6:流控制语句
????????在這部分 C# 教程中,將討論流控制。我們定義了幾個(gè)關(guān)鍵字,使我們能夠控制 C# 程序的流程。
????????在 C# 語言中,有幾個(gè)關(guān)鍵字用于改變程序的流程。當(dāng)程序運(yùn)行時(shí),語句從源文件的頂部執(zhí)行到底部逐個(gè)語句遞進(jìn)。此流程可以通過特定關(guān)鍵字進(jìn)行更改。語句可以執(zhí)行多次。有些語句稱為條件語句。它們僅在滿足特定條件時(shí)執(zhí)行。
一、C# if 表達(dá)式
if 語句具有以下一般形式:
if (expression) {statement; }if 關(guān)鍵字用于檢查表達(dá)式是否為真。如果為真,則執(zhí)行語句。該語句可以是單個(gè)語句或復(fù)合語句。復(fù)合語句由塊包圍的多個(gè)語句組成。塊是用大括號括起來的代碼。
Program.cs
var r = new Random();
int n = r.Next(-5, 5);
Console.WriteLine(n);
if (n > 0)
{
??? Console.WriteLine("The n variable is positive");
}
生成一個(gè)隨機(jī)數(shù)。如果數(shù)字大于零,我們會向終端打印一條消息。
這兩行生成一個(gè)介于 -5 .. 5 之間的隨機(jī)整數(shù)。
if (n > 0) {Console.WriteLine("The n variable is positive"); }????????使用 if 關(guān)鍵字,我們檢查生成的數(shù)字是否大于零。 if 關(guān)鍵字后跟一對圓括號。在括號內(nèi),我們放置一個(gè)表達(dá)式。該表達(dá)式產(chǎn)生一個(gè)布爾值。如果布爾值為真,則執(zhí)行由兩個(gè)大括號括起來的塊。在我們的例子中,字符串“The n variable is positive”被打印到終端。如果隨機(jī)值為負(fù),則什么也不做。如果我們只有一個(gè)表達(dá)式,大括號是可選的。
$ dotnet run -3 $ dotnet run -4 $ dotnet run -1 $ dotnet run 1 The n variable is positive滿足條件時(shí),將消息寫入控制臺。
二 、 C# else表達(dá)式
????????我們可以使用 else 關(guān)鍵字來創(chuàng)建一個(gè)簡單的分支。如果 if 關(guān)鍵字后面的方括號內(nèi)的表達(dá)式計(jì)算結(jié)果為 false,則會自動執(zhí)行 else 關(guān)鍵字后面的語句。
Program.cs
var r = new Random(); int n = r.Next(-5, 5);Console.WriteLine(n);if (n > 0) {Console.WriteLine("The number is positive"); } else {Console.WriteLine("The number is negative"); }if 關(guān)鍵字后面的塊被執(zhí)行,或者 else 關(guān)鍵字后面的塊被執(zhí)行。
if (n > 0) {Console.WriteLine("The number is positive"); } else {Console.WriteLine("The number is negative"); }else 關(guān)鍵字跟在 if 塊的右花括號之后。它有自己的塊,由一對花括號括起來。
$ dotnet run -3 The number is negative $ dotnet run -1 The number is negative $ dotnet run 2 The number is positiveWe execute the program three times.
三、C# else if表達(dá)式
????????我們可以使用 else if 關(guān)鍵字創(chuàng)建多個(gè)分支。當(dāng)且僅當(dāng)不滿足前一個(gè)條件時(shí),else if 關(guān)鍵字測試另一個(gè)條件。請注意,我們可以在測試中使用多個(gè) else if 關(guān)鍵字。
Program.cs
var r = new Random(); int n = r.Next(-5, 5);Console.WriteLine(n);if (n < 0) {Console.WriteLine("The n variable is negative"); } else if (n == 0) {Console.WriteLine("The n variable is zero");} else {Console.WriteLine("The n variable is positive"); }以前的程序有一個(gè)小問題。零被賦予負(fù)值。以下程序?qū)⒔鉀Q此問題。
if (n < 0) {Console.WriteLine("The n variable is negative"); } else if (n == 0) {Console.WriteLine("The n variable is zero"); } else {Console.WriteLine("The n variable is positive"); }????????如果第一個(gè)條件評估為真,例如輸入的值小于零,執(zhí)行第一個(gè)程序段,跳過剩余的兩個(gè)程序段。如果不滿足第一個(gè)條件,則檢查 if else 關(guān)鍵字之后的第二個(gè)條件。如果第二個(gè)條件為真,則執(zhí)行第二個(gè)塊。如果不是,則執(zhí)行 else 關(guān)鍵字之后的第三個(gè)塊。如果不滿足先前的條件,則始終執(zhí)行 else 塊。
$ dotnet run -1 The n variable is negative $ dotnet run 4 The n variable is positive $ dotnet run 1 The n variable is positive $ dotnet run 0 The n variable is zero我們執(zhí)行程序 3 次。 0 被正確處理。
四、C# switch表達(dá)式
????????switch 語句是一個(gè)選擇控制流語句。它允許變量或表達(dá)式的值通過多路分支控制程序執(zhí)行流程。它以比使用 if/else if/else 語句組合更簡單的方式創(chuàng)建多個(gè)分支。
????????我們有一個(gè)變量或表達(dá)式。 switch 關(guān)鍵字用于根據(jù)值列表測試變量或表達(dá)式中的值。值列表與 case 關(guān)鍵字一起顯示。如果值匹配,則執(zhí)行 case 后面的語句。有一個(gè)可選的默認(rèn)語句。如果沒有找到其他匹配項(xiàng),則執(zhí)行它。
從 C# 7.0 開始,匹配表達(dá)式可以是任何非空表達(dá)式。
switch 語句相當(dāng)復(fù)雜。
4.1 Selecting day of week
在以下示例中,我們選擇帶有 switch 語句的星期幾。
Program.cs
var dayOfWeek = DateTime.Now.DayOfWeek;switch (dayOfWeek) {case DayOfWeek.Sunday:Console.WriteLine("dies Solis");break;case DayOfWeek.Monday:Console.WriteLine("dies Lunae");break;case DayOfWeek.Tuesday:Console.WriteLine("dies Martis");break;case DayOfWeek.Wednesday:Console.WriteLine("dies Mercurii");break;case DayOfWeek.Thursday:Console.WriteLine("dies Jovis");break;case DayOfWeek.Friday:Console.WriteLine("dies Veneris");break;case DayOfWeek.Saturday:Console.WriteLine("dies Saturni");break; }該示例確定當(dāng)前星期幾并打印其拉丁語等價(jià)物。
switch (dayOfWeek) {... }????????在圓括號中,switch 關(guān)鍵字從表達(dá)式中獲取一個(gè)值,該表達(dá)式將被測試。 switch 關(guān)鍵字的正文放置在一對或大括號內(nèi)。在正文中,我們可以放置多個(gè)案例選項(xiàng)。每個(gè)選項(xiàng)都以 break 關(guān)鍵字結(jié)尾。
case DayOfWeek.Sunday:Console.WriteLine("dies Solis");break;????????使用 case 語句,我們測試匹配表達(dá)式的值。如果它等于 DayOfWeek.Sunday,我們打印拉丁文 dies Solis。
$ dotnet run dies Solis 該計(jì)劃于周日運(yùn)行。4.2 Selecting domain
????????要求用戶輸入域名。域名被讀取并存儲在一個(gè)變量中。該變量使用 switch 關(guān)鍵字針對選項(xiàng)列表進(jìn)行測試。
Program.cs
Console.Write("Enter a domain name: ");string domain = Console.ReadLine();domain = domain.Trim().ToLower();switch (domain) {case "us":Console.WriteLine("United States");break;case "de":Console.WriteLine("Germany");break;case "sk":Console.WriteLine("Slovakia");break;case "hu":Console.WriteLine("Hungary");break;default:Console.WriteLine("Unknown");break; }在我們的程序中,我們有一個(gè)域變量。我們從命令行讀取變量的值。我們使用 case 語句來測試變量的值。有幾種選擇。例如,如果該值等于“us”,則“United States”字符串將打印到控制臺。
string domain = Console.ReadLine();Input from the user is read from the console.
domain = domain.Trim().ToLower();Trim 方法從潛在的前導(dǎo)和尾隨空格中去除變量。 ToLower 將字符轉(zhuǎn)換為小寫。現(xiàn)在“us”、“US”、“us”是美國域名的可行選項(xiàng)。
case "us":Console.WriteLine("United States"); break;????????在這種情況下,我們測試域變量是否等于“us”字符串。如果為真,我們會向控制臺打印一條消息。該選項(xiàng)以 break 關(guān)鍵字結(jié)尾。如果成功評估了其中一個(gè)選項(xiàng),break 關(guān)鍵字將終止 switch 塊。
default:Console.WriteLine("Unknown"); break;默認(rèn)關(guān)鍵字是可選的。如果沒有評估任何案例選項(xiàng),則執(zhí)行默認(rèn)部分。
$ dotnet run Enter a domain name: us United States$ dotnet run Enter a domain name: HU Hungary$ dotnet run Enter a domain name: pl Unknown4.3 應(yīng)用when 表達(dá)式
case 語句可以與 when 語句一起使用來指定附加條件。
Program.cs
Console.Write("Enter your age: ");var input = Console.ReadLine();var age = Int32.Parse(input.Trim());switch (age) {case var myAge when myAge < 0:Console.WriteLine("Age cannot be a negative value");break;case var myAge when myAge > 130:Console.WriteLine("This is an unlikely high age");break;default:Console.WriteLine("The entered age is {0}", age);break; }在程序中,要求用戶輸入他的年齡。
case var myAge when myAge < 0:Console.WriteLine("Age cannot be a negative value"); break;????????在 when 表達(dá)式的幫助下,我們測試輸入的值是否小于 0。使用 var 關(guān)鍵字,我們創(chuàng)建一個(gè)臨時(shí)的 myAge 變量。
4.4 枚舉算數(shù)表達(dá)式
對于匹配表達(dá)式,我們可以使用任何類型。在下面的示例中,我們使用枚舉。
Program.cs
var color = (Color) (new Random()).Next(0, 7);switch (color) {case Color.Red:Console.WriteLine("The color is red");break;case Color.Green:Console.WriteLine("The color is green");break;case Color.Blue:Console.WriteLine("The color is blue");break;case Color.Brown:Console.WriteLine("The color is brown");break;case Color.Yellow:Console.WriteLine("The color is yellow");break;case Color.Pink:Console.WriteLine("The color is pink");break;case Color.Orange:Console.WriteLine("The color is orange");break;default:Console.WriteLine("The color is unknown.");break; }enum Color { Red, Green, Blue, Brown, Yellow, Pink, Orange }該示例隨機(jī)生成一個(gè)顏色枚舉。 swith 語句確定生成的顏色值。
$ dotnet run The color is orange$ dotnet run The color is blue$ dotnet run The color is brownWe run the program.
4.5 Switch表達(dá)式
Switch 表達(dá)式使 switch 語句的語法更加簡潔。它們是在 C# 8.0 中引入的。
Program.cs
Console.Write("Enter a domain name: ");string domain = Console.ReadLine();domain = domain.Trim().ToLower();string result = domain switch {"us" => "United States","de" => "Germany","sk" => "Slovakia","hu" => "Hungary",_ => "Unknown" };Console.WriteLine(result);該變量位于 switch 關(guān)鍵字之前。 case?和?:?元素被替換為?=>。默認(rèn)大小寫替換為 _ 丟棄。主體是表達(dá)式,而不是語句。
4.6 C# while 表達(dá)式
while 語句是一種控制流語句,允許根據(jù)給定的布爾條件重復(fù)執(zhí)行代碼。
while (expression) {statement; }while 關(guān)鍵字執(zhí)行大括號括起來的塊內(nèi)的語句。每次表達(dá)式被評估為真時(shí),都會執(zhí)行這些語句。
Program.cs
int i = 0; int sum = 0;while (i < 10) {i++;sum += i; }Console.WriteLine(sum);在代碼示例中,我們計(jì)算一系列數(shù)字中的值的總和。
while 循環(huán)包含三個(gè)部分。初始化、測試和更新。語句的每次執(zhí)行稱為一個(gè)循環(huán)。
int i = 0;我們啟動 i 變量。它用作計(jì)數(shù)器。
while (i < 10) {... }while 關(guān)鍵字后面的圓括號內(nèi)的表達(dá)式是第二階段,即測試。執(zhí)行主體中的語句,直到表達(dá)式被評估為假。
i++;這是 while 循環(huán)的最后一個(gè)第三階段,即更新。我們增加計(jì)數(shù)器。請注意,對 while 循環(huán)的不當(dāng)處理可能會導(dǎo)致無限循環(huán)。
4.7 Do-while 表達(dá)
可以至少運(yùn)行該語句一次。即使條件不滿足。為此,我們可以使用 do while 關(guān)鍵字。
Program.cs
int count = 0;do {Console.WriteLine(count); } while (count != 0);首先執(zhí)行塊,然后評估真值表達(dá)式。在我們的例子中,條件不滿足,do while 語句終止。
五、C# for 表達(dá)式
????????如果在循環(huán)開始之前知道循環(huán)數(shù),我們可以使用 for 語句。在這個(gè)結(jié)構(gòu)中,我們聲明了一個(gè)計(jì)數(shù)器變量,它在每次循環(huán)重復(fù)期間自動增加或減少值。
5.1?簡單的for循環(huán)
for 循環(huán)具有三個(gè)階段:初始化、條件和代碼塊執(zhí)行以及增量。
Program.cs
for (int i=0; i<10; i++) {Console.WriteLine(i); }在此示例中,我們將數(shù)字 0..9 打印到控制臺。
for (int i=0; i<9; i++) {Console.WriteLine(i); }分為三個(gè)階段。在第一階段,我們將計(jì)數(shù)器 i 設(shè)為零。這個(gè)階段只進(jìn)行一次。接下來是條件。如果滿足條件,則執(zhí)行 for 塊內(nèi)的語句。在第三階段,計(jì)數(shù)器增加。現(xiàn)在我們重復(fù)2、3階段,直到條件不滿足,退出for循環(huán)。在我們的例子中,當(dāng)計(jì)數(shù)器 i 等于 10 時(shí),for 循環(huán)停止執(zhí)行。
5.2??for循環(huán)數(shù)組遍歷
for 循環(huán)可用于遍歷數(shù)組。根據(jù)數(shù)組的 Length 屬性,我們知道數(shù)組的大小。
Program.cs
string[] planets = { "Mercury", "Venus", "Earth","Mars", "Jupiter", "Saturn", "Uranus", "Pluto" };for (int i = 0; i < planets.Length; i++) {Console.WriteLine(planets[i]); }Console.WriteLine("In reverse:");for (int i = planets.Length - 1; i >= 0; i--) {Console.WriteLine(planets[i]); }????????我們有一個(gè)包含太陽系中行星名稱的數(shù)組。使用兩個(gè) for 循環(huán),我們按升序和降序打印值。
for (int i = 0; i < planets.Length; i++) {Console.WriteLine(planets[i]); }????????通過從零開始的索引訪問數(shù)組。第一項(xiàng)的索引為 0。因此,變量 i 被初始化為零。該條件檢查 i 變量是否小于數(shù)組的長度。在最后階段,i 變量遞增。
for (int i = planets.Length - 1; i >= 0; i--) {Console.WriteLine(planets[i]); }????????這個(gè) for 循環(huán)以相反的順序打印數(shù)組的元素。 i 計(jì)數(shù)器初始化為數(shù)組大小。由于索引是從零開始的,因此最后一個(gè)元素的索引數(shù)組大小為 1。該條件確保計(jì)數(shù)器大于或等于零。 (數(shù)組索引不能為負(fù)數(shù))。在第三步中,i 計(jì)數(shù)器減一。
5.3 更多 for loop表達(dá)式
More expressions can be placed in the initialization and iteration phase of the for loop.
Program.cs
var r = new Random(); var values = new int[10];int sum = 0; int num = 0;for (int i = 0; i < 10; i++, sum += num) {num = r.Next(10);values[i] = num; }Console.WriteLine(string.Join(",", values)); Console.WriteLine("The sum of the values is {0}", sum);在我們的示例中,我們創(chuàng)建了一個(gè)包含十個(gè)隨機(jī)數(shù)的數(shù)組。計(jì)算數(shù)字的總和。
for (int i = 0; i < 10; i++, sum += num) {num = r.Next(10);values[i] = num; }在 for 循環(huán)的第三部分,我們有兩個(gè)用逗號分隔的表達(dá)式。 i 計(jì)數(shù)器遞增并將當(dāng)前數(shù)字添加到 sum 變量。
Console.WriteLine(string.Join(",", values));使用 System.String 類的 Join 方法,我們一次性打印出數(shù)組的所有值。它們將用逗號分隔。
$ dotnet run 9,3,1,7,9,8,5,6,3,3 The sum of the values is 545.4?嵌套 for 循環(huán)
for 語句可以嵌套;即一個(gè) for 語句可以放在另一個(gè) for 語句中。嵌套 for 循環(huán)的所有循環(huán)都針對外部 for 循環(huán)的每個(gè)循環(huán)執(zhí)行。
Program.cs
var a1 = new string[] { "A", "B", "C" }; var a2 = new string[] { "A", "B", "C" };for (int i=0; i<a1.Length; i++) {for (int j=0; j<a2.Length; j++){Console.WriteLine(a1[i] + a2[j]);} }在此示例中,我們創(chuàng)建兩個(gè)數(shù)組的笛卡爾積。
var a1 = new string[] { "A", "B", "C" }; var a2 = new string[] { "A", "B", "C" };我們有兩個(gè)數(shù)組。每個(gè)數(shù)組都有樹字母。 caresian 乘積是當(dāng)一個(gè)數(shù)組中的每個(gè)元素與另一個(gè)數(shù)組的所有元素配對時(shí)。為此,我們使用嵌套的 for 循環(huán)。
for (int i=0; i<a1.Length; i++) {for (int j=0; j<a2.Length; j++){Console.WriteLine(a1[i] + a2[j]);} }在另一個(gè)父 for 循環(huán)內(nèi)有一個(gè)嵌套 for 循環(huán)。對于父 for 循環(huán)的每個(gè)循環(huán),嵌套的 for 循環(huán)都會完全執(zhí)行。
$ dotnet run AA AB AC BA BB BC CA CB CC六、 C# foreach表達(dá)式
foreach 結(jié)構(gòu)簡化了對數(shù)據(jù)集合的遍歷。它沒有明確的計(jì)數(shù)器。 foreach 語句一一遍歷數(shù)組或集合,并將當(dāng)前值復(fù)制到構(gòu)造中定義的變量中。
Program.cs
string[] planets = { "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune" };foreach (string planet in planets) {Console.WriteLine(planet); }在此示例中,我們使用 foreach 語句遍歷一系列行星。
foreach (string planet in planets) {Console.WriteLine(planet); }foreach 語句的用法很簡單。行星是我們迭代的數(shù)組。行星是一個(gè)臨時(shí)變量,具有數(shù)組中的當(dāng)前值。 foreach 語句遍歷所有行星并將它們打印到控制臺。
$ dotnet run Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune七、C# break 表達(dá)式
break 語句可用于終止由 while、for 或 switch 語句定義的塊。
Program.cs
var random = new Random();while (true) {int num = random.Next(1, 30);Console.Write("{0} ", num);if (num == 22){break;} }Console.Write('\n');我們定義了一個(gè)無限的 while 循環(huán)。我們使用 break 語句來擺脫這個(gè)循環(huán)。我們從 1 到 30 中選擇一個(gè)隨機(jī)值。我們打印該值。如果該值等于 22,我們將結(jié)束無限的 while 循環(huán)。
$ dotnet run 18 3 21 26 12 27 23 25 2 21 15 4 18 12 24 13 7 19 10 26 5 22八、C# continue 表達(dá)式
continue 語句用于跳過循環(huán)的一部分并繼續(xù)循環(huán)的下一次迭代。它可以與 for 和 while 語句結(jié)合使用。
在下面的示例中,我們打印一個(gè)不能被 2 除而沒有余數(shù)(奇數(shù))的數(shù)字列表。
Program.cs
int num = 0;while (num < 1000) {num++;if (num % 2 == 0){continue;}Console.Write($"{num} "); }Console.Write('\n');我們使用 while 循環(huán)遍歷數(shù)字 1..999。
if (num % 2 == 0) {continue; }如果表達(dá)式 num % 2 返回 0,則所討論的數(shù)字可以除以 2。執(zhí)行 continue 語句并跳過循環(huán)的其余部分。在我們的例子中,循環(huán)的最后一條語句被跳過并且數(shù)字不會打印到控制臺。下一次迭代開始。
總結(jié)
以上是生活随笔為你收集整理的C#教程6:流控制语句的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时间序列:等分布序列(Equidistr
- 下一篇: C#教程7:数组