首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

很少有程序从头到尾逐行连续执行。反之,程序的执行流程会是按条件的。当遇到某种条件时,可能需要程序执行特定的代码块,或者没遇到该条件时执行另一代码块。程序也可能需要重复执行同一段代码。C#语言能提供数种循环和其他控制结构流程,来适应这些情况。

1.11.1  if语句

if语句是基本的条件分支语句,在满足某条件时,执行一行或多行代码,该条件表现为一个逻辑表达式。当条件没有得到满足时,将执行else关键字后面的代码。if语句中的else子句是可选的。

if语句的基本语法如下所示:

  if (condition) {

  execute whatever code is contained within the braces if condition is met

  }

或者,添加可选的else子句:

  if (条件) {

  execute whatever code is contained within the braces if condition is met

  }

  else {

  execute whatever code is contained withia the braces if condition is NOT met

  }

如果if或(可选的)else关键字后面只有一行可执行语句,则可以省略大括号:

  // 伪代码。

  if (condition) Single statement to execute if true;

  else Single stretment to execute if false;

但通常认为总是使用大括号是好习惯。

单个布尔变量,作为布尔表达式的简单形式,自然也可用作if语句的逻辑表达式或条件。例如,下面的写法完全可接受:

  // 使用这个bool变量作为标识,

  // 当某种操作完成时设置为true

  bool finished;

 

  // 初始化为false

  finished = false;

 

  // 插入的代码,在这里标识可能被设置为true……细节已省略。

 

  // 测试标识。

  if (finished) { // 等同于:if (finished == true) {

    Console.WriteLine("完成。");

  }

这时,逻辑表达式是响应“是否finished”或“finished是否等于true”的if语句的条件。

!操作符用于否定逻辑表达式,这样,if语句就能在表达式求值为false时执行代码块。

  if (!finished) { // 等同于:if (finished == false)

      // 如果finished变量被设置为false,这段代码会被执行。

      Console.WriteLine("We are not finished");

  }

这时,逻辑表达式是响应“是否未finished”或“finished不等于true”的if语句的条件。

在测试是否相等时,要记得使用两个连续的等于号:

  if (x == 3) { // 注意使用双等于号(= =)判断是否相等。

  y = x;

  }

 

C#初学者常犯的错误是使用单个等于号测试是否相等:

  if (x = 3) {…}

C#中,if判断只能用于有效的逻辑表达式;x=3不是逻辑表达式,而是赋值表达式。

上面的语句甚至根本不能被C#编译器编译,而它却可以被CC++语言所接受,因为在这些语言里,if测试基于的表达式值为整数0(等同于false)或非0(等同于true)。

可以使用嵌套的if-else构造来测试多个条件。在嵌套使用时,里面的if语句(也许还有else语句)被放置在外面的if语句的else部分中。

两层嵌套的if-else构造基本语法如下所示:

  if (condition1) {

  // 执行这些代码

  }

  else {

  if (condition2) {

     // 执行另外的代码

  }

  else {

     // 如果不满足上述条件,则执行这些代码

  }

  }

if-else构造的嵌套层数没有限制。

上例中的嵌套if语句也可以用非嵌套的方式实现:

  if (condition1) {

     // 执行这些代码

  }

  else if (condition2) {

       // 执行另外的代码

  }

  else {

       // 如果不满足上述条件,则执行这些代码

  }

两种形式在逻辑上等同。

下面的例子使用一个嵌套if-else构造,根据员工销售额和服务时间计算奖金额度:

  using System;

 

  public class IfDemo

  {

     static void Main() {

       double sales = 40000.0;

       int lengthOfService = 12;

       double bonus;

 

       if (sales > 30000.0 && lengthOfService >= 10) {

         bonus = 2000.0;

       }

       else {

         if (sales > 20000.0) {

           bonus = 1000.0;

        }

        else {

           bonus = 0.0;

        }

      }

 

      Console.WriteLine("Bonus = " + bonus);

    }

  }

该例程执行结果如下:

Bonus = 2000.0

1.11.2  switch语句

switch语句允许根据条件判断执行一行或多行代码,这与if-else构造相同。不同的是,if-else构造计算一个逻辑表达式的值,而switch语句则拿一个整数或string表达式的值与一个或多个case标签中的值做比较。如果符合其中之一,对应标签后面的代码就会被执行。也可以使用一个可选的default标签,在表达式值不满足任何一个case标签时,执行其后面的代码。

switch语句的一般语法如下:

  switch (int-or-string-expression) {

       case value1:

          // 如果表达式和value1相符,执行这些代码

          break;

       case value2:

          // 如果表达式和value2相符,执行这些代码

          break;

          // 更多的case标签……

          case valueN:

          // 如果表达式和valueN相符,执行这些代码

          break;

       default:

          // 如果不满足任何标签,执行默认代码

          break;

  }

例如:

  int x;

 

  // x被赋值,具体细节忽略……

 

  switch (x) {

      case 1:

        // 伪代码。

        do something based on the fact that x equals 1

        break;

      case 2:

        // 伪代码。

        do something based on the fact that x equals 2

        break;

      default:

        // 伪代码。

        do something based on the fact that x equals something ot her than 1 or 2

        break;

  }    

 

注意:

l      switch关键字后面圆括号中的表达式,其值的类型必须是string或整数。(charintlong类型都是整数,所以这些类型都可用在switch语句中。)

l      case标签后面的值必须是常数(整数、字符或字符串)。

l      casedefault标签行以冒号而非分号结束。

l      给定case标签后面的语句组,无需用括号包围。它们更像一个语句列表,而不是代码块。

if语句不同,在满足条件和执行了相应case标签后的代码后,switch语句并不会自动终结。要离开switch语句,必须使用跳出语句jump statement)——典型的跳出语句是break。如果在任一case标签中没有跳出语句,程序就会继续执行,“贯穿”下一个casedefault标签。这种情形可被这样利用:假若多个case标签需要执行相同逻辑,则可将它们堆叠起来:

  // 假定x已被声明为int变量

  switch (x) {

       case 1:

       case 2:

       case 3:

            // 如果x等于123,执行这些代码

            break;

       case 4:

           //如果x等于4,执行这些代码

  }

需要在一系列互斥条件中选择其一时,switch语句非常有用。下例使用switch语句,基于country变量的值,给capital变量赋值。如果没找到匹配结果,则变量被赋值为“not in the database”。

  using System;

 

  public class SwitchDemo

  {

    static void Main() {

   string country;

   string capital;

   country = "India";

 

  // 使用switch语句,拿country变量的值

  // 和三个case标签的值进行比较,如果都不符合,

  // 执行default标签后面的代码。

 

  switch (country) {

    case "england":

      capital = "London";

      break;

    case "India":

      capital = "New Delhi";

      break;

    case "USA":

      capital = "Washington";

      break;

    default:

      capital = "not in the database";

      break;

  }

 

  Console.WriteLine(country + "的首都是" + capital);

     }

  }

上例输出结果如下:

  The capital of India is New Delhi

1.11.3  for语句

for语句是一种编程构造,用来执行指定次数的一个或多个语句。for语句的一般语法如下:

  for (initializer; condition; iterator) {

    // conditiontrue时要执行的代码

  }

for语句定义三个放在后面圆括号中的元素,元素之间用分号分隔。

初始算子initializer)用来给循环控制变量loop control variable)赋予初始值。该变量可以在初始算子中声明,也可以在for语句之前的代码中声明。例如:

    // 在语句中声明循环控制变量i

       for (int i = 0; condition; iterator) {

       // conditiontrue时要执行的代码

    }

  // for循环推出时,i不再可用。

也可以这样:

    // for语句之前声明循环控制变量i

    int i;

 

    for (i = 0; condition; iterator) {

         // condition true时要执行的代码

    }

    // 注意,因为i在循环语句之前被声明,

    // 故推出for循环后仍可使用i

条件算子condition)是一个逻辑表达式,通常和循环控制变量有关:

    for (int i = 0; i < 5; iterator) {

         // 只要i小于5,就要执行这些代码

    }

循环算子(iterator通常用来递增或递减循环控制变量:

    for (int i = 0; i < 5; i++) {

         //只要i小于5,就要执行这些代码

    }

注意,只在初始算子和条件算子后面使用分号,循环算子后面不需要。

下面是for循环的操作过程:

l      当程序执行至for语句时,初始算子被执行一次,且只被执行这一次。

l      然后计算条件表达式。如果该表达式值为true,则圆括号后面的代码会被执行。

l      该代码块执行完毕后,执行循环算子。

l      重新计算条件表达式。如果计算结果仍然为true,代码块和循环算子会再被执行。

这一过程循环往复,直至条件表达式值为falsefor循环退出为止,

下面是用嵌套for语句生成简单乘法表的例子。循环控制变量jk在相应的for语句中声明。只要满足对应for语句中的条件,该for语句后面的代码块就会被执行。++运算符被用来在代码块每次执行后递增jk的值。

  using System;

 

  public class ForDemo

  {

    static void Main() {

      // 生成简单的乘法表。

 

      for (int j = 1; j <= 4; j++) {

        for (int k = 1; k <= 4; k++) {

          Console.WriteLine("" + j + " * " + k + " = " + (j * k));

        }

      }

    }

  }

执行结果如下:

  1 * 1 = 1

  1 * 2 = 2

  1 * 3 = 3

  1 * 4 = 4

  2 * 1 = 2

  2 * 2 = 4

  2 * 3 = 6

  2 * 4 = 8

等等。

注意ForDemo例子中字符串连接运算符+的使用;int变量jk和字符串“”、“*”和”=”连接的结果,是string类型的值。

for语句后面圆括号中的三个元素都是可以省去的(不能省略那两个分号):

如果初始算子被略去,则必须在for语句之前声明和初始化循环控制变量。

  int i = 0;

  for (; i < 5; i++) {

 

       // 只要i小于5就执行某种操作

  }

如果循环算子被略去,需要在for循环体内部显式地更新循环控制变量的值,避免死循环:

  for (int i = 0; i < 5; ) {

       // i小于5时执行某些操作

 

    // 显式地递增i

    i++;

  }

如果忽略条件算子,结果极有可能是陷入死循环:

  for (;;) {

       // 死循环!

  }

在本章稍后的“跳出语句”部分,我们会了解到可以使用跳出语句中断循环。

和其他流程控制结构一样,如果在for语句后面只有一行语句,则可以省略大括号:

  for (int i = 0; i < 3; i++) sum = sum + i;

不过,在任何情况下都使用大括号,被看作是良好的编程习惯。

1.11.4  while语句

while语句与for语句异曲同工,都被用来重复执行一段代码。不过,如果在循环开始时并不知道到底要执行多少次代码,最好使用while语句,因为只要条件符合它就会持续执行。

while语句的一般语法如下:

  while (条件) {

      // 条件为true时执行这些代码

  }

条件可以是简单的或复杂的逻辑表达式,该表达式得出truefalse的结果。例如:

  int x = 1;

  int y = 1;

 

  while (x < 20 || y < 10) {

    // 伪代码:

    presumably do something that aflects the value of either x or y

  }

当程序执行至一个while语句时,会首先求条件表达式的值。如果值为true,条件表达式后面的代码块就会被执行。代码块的执行结束后,再次对条件表达式求值,如果还是为true,则如此重复执行直至求得false值,退出while循环。

下面的简单例子演示了while循环的用法。被命名为finishedbool变量初始值是false。它被用来做标识:只要finished值为falsewhile循环后面的代码就会持续被执行。代码块中某些条件语句会把finished的值设置为truewhile循环将在这个点上退出。

  using System;

 

  public class WhileDemo

  {

    static void Main() {

      bool finished = false;

      int i = 0;

 

      while (!finished) {

        Console.WriteLine(i);

        i++;

        if (i == 3) finished = true; // 设置标识值

      }

    }

  } 

执行结果是:

  0

  1

  2

和其他流程控制结构一样,如果条件表达式后面只有一行语句,则可以省略大括号:

  while (x < 20) x = x * 2;

不过,始终使用大括号被看作是良好的编码习惯。

1.11.5  do语句

使用while循环时,对条件表达式的求值操作先于跟在它后面的代码执行操作。因而,如果条件表达式值为false,则代码有可能永不被执行。do循环和while循环类似,不同的是代码块先于条件表达式求值操作之前被执行。这样,就能保证循环的代码块至少会被执行一遍。

下面是do语句的一般语法:

  do {

    // 要执行的代码

  } while (condition);

作为while语句的标签,do语句的条件是一个逻辑表达式,将求得布尔值。把分号置于围绕在条件表达式的括号后面,标识do语句的结束。在明确知道需要执行至少一次循环体以初始化值的时候,可以使用do循环。

  bool flag;

 

  do {

    // 无论flag初始值是什么都执行某些代码,

    // 然后根据flag的值测算是否再次执行循环代码.

    // 可以在循环体内部把flag的值设置为flase

    // 标识来通知循环应该结束了。

  } while (flag);

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论