【问题标题】:I don't understand the use of "while(true)" and "for(; ;)" loops in C#!我不明白 C# 中“while(true)”和“for(; ;)”循环的使用!
【发布时间】:2012-01-16 13:40:19
【问题描述】:

While(true) 循环的示例代码:

    public void HandleConnection()
    {
        TcpClient tcpClient = tcpListener.AcceptTcpClient();
        NetworkStream networkStream = tcpClient.GetStream();
        while (true)   /**Don't understand this while(true) loop**/
        {
            buffer = new byte[1024];
            n = networkStream.Read(buffer, 0, buffer.Length);
            if (n == 0)
            {
                break;
            }

        }
    }

for(; ;) 循环的示例代码:

     public void readLine(NetworkStream inputStream)
     {
        using (StreamReader reader = new StreamReader(inputStream))
        {

            char[] buffer = new char[128];
            int n;

            for (; ; ) /**Don't understand this for(; ;) loop**/
            {
                n = reader.Read();
                if (n == -1 || n == '\n')
                {
                    break;
                }
        }
      }

任何人都可以通过参考提供的示例代码清楚地理解上述循环语句吗?感谢您的帮助!

【问题讨论】:

  • 它们就像任何其他循环一样:只要条件为真(在这些“特殊情况”中总是如此)或直到以breakreturn、@ 退出,它们就会执行987654325@ 或 throw (我错过了任何方法吗?)。

标签: c# for-loop while-loop


【解决方案1】:

C# 有两个基本的循环结构。 whilefor 语句允许您在循环开始时检查循环退出条件。 do-while 语句允许您在循环结束时检查循环退出条件。

但是当你想检查中间的循环退出条件时,你会怎么做呢?

您只需使用这些语句之一,检查其中的循环退出条件:

for (;;) {
    statements;
    if (exitExpression) break;
    statements;
}

【讨论】:

    【解决方案2】:

    实现这种循环的最惯用方式是 IMO 一个 do-while 循环。这样,您就不需要使用 break 语句进行有点混乱的无限循环了。

    例如,您的第一个示例可能变为:

    int n;
    do 
    {
        byte[] buffer = new byte[1024];
        n = networkStream.Read(buffer, 0, buffer.Length);
    } while (n != 0);
    

    do-while 循环总是执行一次循环体,并在每次迭代后测试 while 条件。

    【讨论】:

    • 我必须使用什么:do {read} while(stream.DataAvailable)while(stream.DataAvailable) {read}
    【解决方案3】:

    第一个应该很简单:

    while(true)
    

    这只是意味着您应该无限循环(除非循环内有一些break)。如果您只是将其作为常规的英文行阅读,则其含义应该很清楚。

    另一个解释起来有点棘手:

    for( ; ; )
    

    通常( ... ) 中的部分包含三个语句:(1) 起点,(2) 退出条件,(3) 增量。如果没有这三个语句,它将无限循环。主要是因为没有退出条件。

    【讨论】:

    • 实际上,您可以拥有#1 (initializers) 和#3 (iterators),但仍然没有#2 (expression) 和for。缺少的expression 被简单地视为“真”:也就是说,for(x;;y) 等同于for(x;true;y)
    • 没错,但不要马上把它弄得太复杂。
    【解决方案4】:

    While(true) 是无限循环。循环将一直运行,直到networkStream.Read(buffer, 0, buffer.Length); 返回 0。如果返回 0 值,则循环将中断:

      if (n == 0)
      {
        break;
      }
    

    'for' 循环也是如此。循环将再次无限运行。当reader.Read(); 返回值-1'\n' 时,应用程序将退出循环。要记住的重要一点是,当您使用双逻辑 OR 运算符 (n == -1 || n == '\n') 而不是单逻辑 (n == -1 | n == '\n'),当第一个逻辑语句为真时输入'if'语句就足够了。如果第一个逻辑语句为真,则第二个甚至不会被检查。

    【讨论】:

    • 这里为什么是死循环? while (true) {} 是“无限的”,但这有一个明确的中断条件。
    • 循环验证语句是示例总是正确的,这就是循环可以无限工作的原因。它可以无限工作的事实并不意味着它必须或总是应该。
    • 但这也可以无限工作:n = false; while(n) { if (nevertrue) { n = true } } ...
    【解决方案5】:

    这两种语法都是实现无限循环的方式。

    循环表示读取,直到流中没有可读取的内容。

    For 循环说读取,直到你得到一个换行符或 -1。

    【讨论】:

    • 但在示例中它们并不比:n = f(); while (!n) { n = f(); } 更无限,所以必须有其他东西在起作用 ;-)
    【解决方案6】:

    代码说明:

    public void HandleConnection()
    {
        int n;
        byte[] buffer = new byte[1024];
        TcpClient tcpClient = tcpListener.AcceptTcpClient();
        NetworkStream networkStream = tcpClient.GetStream();
        networkStream.Write(buffer, 0, buffer.Length);
        while (true)   // This is a infinity loop and does never stop ( same in the for (;;) loop )
        {
            buffer = new byte[1024];
            n = networkStream.Read(buffer, 0, buffer.Length);
            // Check if there has been data on the network stream
            if (n == 0)
            {
                // No data has been read, exit from the infinity loop
                break;
            }
    
        }
    }
    

    【讨论】:

      【解决方案7】:

      有两个循环永远不会终止。 while(true) 只是因为true 总是为真,后者是因为没有指定终止条件。

      它们只是用于重复执行代码,直到循环在其他地方中断,即当 n 对前者等于 0 时,而当 n 等于 -1 或 ' 后者中的\n'(换行符)。

      第一个可以改写为:

          n = 1;
      
          while (n)
          {
              buffer = new byte[1024];
              n = networkStream.Read(buffer, 0, buffer.Length);
          }
      

      【讨论】:

        【解决方案8】:

        在这两种情况下,您都可以切换 while 和 for。如果你不在里面放一个break,两者都会永远循环。与 for 相比,我更喜欢带 break 的 while(true)。

        【讨论】:

          【解决方案9】:

          那些是无限循环。在第一种情况下,您无限循环以从网络流中读取,而在第二种情况下,您正在从文件流中读取。

          在这两种情况下,您都可以在满足某些条件时使用break 来中断循环。

          【讨论】:

          • 一个有明确退出条件的循环怎么可能是无限的? :(
          • 无限循环通常是人们想要避免的,除非它是设计的一部分。在大多数情况下,当您需要在不确定的时间内迭代某些内容时,例如从套接字读取或等待来自键盘的特定输入时,您会使用无限循环,也就是说,继续做某事直到发生其他通常超出您的程序控制的事情。
          猜你喜欢
          • 1970-01-01
          • 2015-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-30
          • 2010-10-07
          相关资源
          最近更新 更多