while和for语句都在循环开始的时候测试它们的布尔表达式。这意味着假如在首次测试时,布尔表达式就求值为false,那么循环主体一次都不会运行。do语句则不同,它的布尔表达式是在每次重复之后求值的,所以主体至少会执行一次。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)do语句的语法如下(不要忘记最后的分号):
dostatementwhile (booleanExpression);
如果循环主体由多个语句构成,请使用一个语句块。下面是在控制台上输出0~9的那个例子的do语句版本:
int i = 0;do{ Console.WriteLine(i); i++;}while (i != 10);break和continue语句 在前文我们曾用break语句来跳出switch语句。除此之外,还可以使用break语句来跳出一个循环。执行break之后,系统会立即终止循环,并从循环之后的第一个语句继续执行。在这种情况下,循环的更新和继续条件都不会重新判断。 与此相反,continue语句会造成当前循环结束,并立即开始下一次循环(在对布尔表达式进行重新求值之后)。下面是在控制台上输出0~9的那个例子的另一个版本,这一次将使用break和continue语句:int i = 0;while (true){ Console.WriteLine("continue " + i); i++; if (i != 10) continue; else break;} 这段代码看起来让人非常难受。许多编程指南都建议小心使用continue,或者根本不要使用它,否则很容易造成难以理解的代码。continue的行为也令人捉摸不定。例如,假如在一个for语句中执行continue,那么会在运行了for语句的更新部分之后,才开始下一次循环。
在下面的例子中,我们将写一个do语句来将一个数字转换成字符串形式。
使用do语句
1. 在Visual Studio 2005中打开DoStatement项目,它位于My Documents文件夹下的Microsoft PressVisual CSharp Step by StepChapter 5DoStatement子文件夹中。
选择调试|开始执行(不调试)。
Visual Studio 2005将开始生成并运行Windows应用程序。
应用程序将显示一个窗体,其中包含两个文本框和一个Show Steps(显示步骤)按钮。在上方的文本框中输入一个正数(我们使用的算法还不支持负数),然后单击Show Steps按钮,下方的文本框就会显示创建这个数字的字符串形式所需的步骤。
注意 这个简单的例子展示了如何使用do循环将数字转换成字符串。但要注意一点,.NET Framework提供了Convert.ToString方法来做同样的事情。在自己的应用程序中执行类似任务时,应该使用该方法。
2. 作为一个例子,请在上方的文本框中输入2693,然后单击Show Steps按钮。
在下方的文本框中,将显示创建2693的字符串形式所经历的步骤,如图2所示。
图2 单击Show Steps按钮之后将显示具体步骤
3. 关闭窗口,返回Visual Studio 2005编程环境。
4. 在代码和文本编辑器窗口中显示Form1.cs的代码。
找到showSteps_Click方法。该方法会在用户单击了Show Steps按钮之后开始运行。
5. 该方法包含以下语句:
int amount = System.Int32.Parse(number.Text);steps.Text = "";string current = "";do{int digitCode = '0' + amount % 10;char digit = Convert.ToChar(digitCode);current = digit + current;steps.Text += current + "rn";amount /= 10;}while (amount != 0);
注意 r代表一个回车符。在多行文本框控件中输出文本时,需要同时输出一个回车符和一个换行符,才能跳到下一行,并使光标定位到行首。否则,以后输出的文本将出现在同一行上。
第一个语句使用System.Int32类的Parse方法,将number文本框的Text属性中存储的字符串值转换成int值:
int amount = System.Int32.Parse(number.Text);
第二个语句清除下方的文本框(称为steps)中显示的文本,这一次的做法是将Text属性设为一个空字符串:
steps.Text = "";
第三个语句声明一个名为current的字符串变量,并把它初始化为空字符串:
string current = ";
这个方法真正的工作是由do语句来执行的,它从第4个语句开始:
do{ ...}while (amount != 0);
我们将利用整数算术操作符和取模操作符,使用10来反复除amount变量,每次获得的余数都是正在构造的字符串的下一个数位。最终,amount将缩减为0值,循环将结束。注意,循环主体至少会执行一次。假如用户输入的就是数字0,这个至少执行一次的行为就正是我们所需要的。
do循环中的第1个语句是:
int digitCode = '0' + amount % 10;
该语句声明一个名为digitCode的int变量,并把它初始化为以下表达式的结果:
'0' + amount % 10
这个表达式需要稍微解释一下!'0'的值是指字符0的值。在Windows使用的字符集中,该字符等于整数值48(每个字符都有它自己的惟一的字符代码,这是一个整数值)。类似地,'1'的字符代码是49,'2'的字符代码是50,以此类推。
amount % 10的值是用10来除amount之后得到的余数。例如,假如amount包含的值是2693,那么2693 % 10的结果是3(2693除以10的结果是商269余3)。因此,假如amount等于2693,那么表达式'0' + amount % 10就等同于'0' + 3,结果是51。这是字符'3'的字符代码。要注意的是,+操作符在这里执行了一次隐式强制类型转换,它将'0'转换成整数值48,使整个表达式能够求值。
do循环中的第2个语句是:
char digit = Convert.ToChar(digitCode);
该语句声明了一个名为digit的char变量,并把它初始化成Convert.ToChar(digitCode)这个方法调用的结果。调用该方法,将返回与参数指定的字符代码对应的一个字符。换言之,Convert.ToChar('0' + 3)的求值结果就是'3'。
do循环中的第3个语句是:
current = digit + current;
该语句将刚才计算出来的字符变量digit附加到字符串current之前。注意,该语句不能替换为current += digit,否则就会将digit附加到current之后。
do循环中的第4个语句是:
steps.Text += current + "rn";
该语句的作用是在Steps文本框的Text属性中附加另一个要显示的步骤。
do循环中的最后一个语句是:
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)amount /= 10;
该语句等同于amount = amount / 10;。如果amount的值是2693,那么在运行上述语句之后,amount的值将变成269。注意,每一次重复do语句,都会从amount中移除最后一个数位,并将那个数位附加到current字符串之前。
在最后一个练习中,将使用Visual Studio 2005调试器来逐步执行上述do语句,以帮助你理解它的工作过程。
逐步执行do语句
1. 在代码和文本编辑器窗口中找到showSteps_Click方法。
2. 将鼠标移至showSteps_Click方法的第一个语句。
第一个语句是:
int amount = System.Int32.Parse(number.Text);
3. 右击第一个语句的任何地方,从弹出菜单中选择运行到光标处。
Visual Studio 2005将生成并运行应用程序。
4. 窗体出现后,在上方的文本框中输入2693,然后单击Show Steps按钮。
程序将暂停运行,Visual Studio 2005将进入调试模式。代码和文本编辑器窗口左侧将出现一个黄箭头,标记出当前语句。
5. 如果调试工具栏不可见,请显示它(选择视图|工具栏|调试)。在调试工具栏上,请单击断点按钮旁边的下拉列表箭头。
随后会打开如图3所示菜单。
图3 单击断点按钮旁边的下拉列表箭头
6. 从这个菜单中选择局部变量。
随后会打开局部变量窗口,其中显示了当前方法中的局部变量的名称、值和类型,其中的amount是局部变量。注意,amount的值目前是0,如图5.4所示。
7. 单击调试工具栏上的逐语句按钮。
调试器将运行当前语句:
int amount = System.Int32.Parse(number.Text);
在局部变量窗口中,amount的值将变成2693,黄箭头会指向下一个语句。
8. 继续单击逐语句按钮。
调试器将运行以下语句:
steps.Text = "";