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