中的多个语句

Multiple statements in for

本文关键字:语句      更新时间:2023-10-16

我有这个代码

for(int l = 1 ; l <= c ; l++, Sleep(500*min(l, 8))) //... <= 4000 msec
  {
      ....
  }

这等于这个吗?

for(int l = 1 ; l <= c ; l++) //... <= 4000 msec
  {
      Sleep(500*min(l, 8))
         ....
  }

我想用 C# 重写原始代码。第二种方法与我将在 C# 中采用的方法相同吗?

不,它们不等同。for循环的停止条件在以下{ }块中的代码之后执行。

所以等价是

for(int l = 1; l <= c; )
{
    /*loop body*/
    l++, Sleep(500 * min(l, 8));
}

表达式分隔符运算符 (,可以替换为语句终止符 ; 。由于两者都是排序点,因此Sleep接收递增的值 l

它们不是等价的,因为for循环的第三部分在每个循环的末尾执行。根据文档,这是for循环的语法。

for (initializer; condition; iterator) {
    body
}

哪里

迭代

器部分定义每次迭代会发生什么 循环的主体。

在原始情况下,l++发生在Sleep之前,所以这是等效的代码:

for(int l = 1 ; l <= c ; l++) //... <= 4000 msec
{
          ......
      Sleep(500*min(l+1, 8)) // note the +1
}

不完全是,代码等效于

for(int l = 1 ; l <= c;) //... <= 4000 msec
{
    // loop body goes here
    ...
    // statements from the last part of the for(...;...;...) statement are executed at the end of the loop
    l++;
    Sleep(500*min(l, 8));
} 

No.您的原始代码等效于

{
    int l = 1 ;
    while( l <= c)
    {
        ....
        l++, Sleep(500*min(l, 8)); //... <= 4000 msec
    }
}

而修改后的版本是

{
    int l = 1 ;
    while( l <= c) //... <= 4000 msec
    {
        Sleep(500*min(l, 8));
        ....
        l++;
    }
}

如您所见,l在用于计算Sleep()时间之后递增,而不是像最初那样在之前递增。此外,Sleep()是在执行循环体的主要部分之前调用的,而不是在执行之后。

for(int l = 0 ; l <= c ; l++, Sleep(500*min(l, 8))) //... <= 4000 msec
  {
  ....
  }

请注意将int l = 1更改为int l = 0,因为您将领先一个计数,因此您必须通过减少一个计数来计算它。所以我l 0<</p>

div class="answers>

一个有趣的选择:

for(int l = 2 ; l <= c+1; l++) //... <= 4000 msec
{
  // ...
  Sleep(500*min(l, 8))
}

与 Gabriel 的答案类似,但+ 1被移动到边界检查,使其余部分看起来相同。(在将代码添加到l以弥补"错过"增量时,代码感觉可疑)。

由于问题还与将代码移植到 C# 有关,因此下面是相关信息。尽管您的两个代码示例并不等效,但它们都直接转换为 C# 代码(当然,C# 等效于 Sleep)。对于 C#,文档中发现的更复杂的示例清楚地表明,当 for 循环的迭代器部分包含多个表达式时,它们将从左到右计算。在C++中,内置逗号运算符还计算从左到右的计算(请参阅此处的"内置逗号运算符"下)。

我认为这里有一些关于C#"for"循环的混淆 - C#确实允许与原始(C++?)代码相同类型的"for"循环(即第三部分中的多个语句):

for (int l = 1; l <= c; l++, System.Threading.Thread.Sleep(500 * Math.Min(l, 8)))
{
    //....
}

如果你想有另一种写法 - 即使上面的"for"循环有效:

int l = 1;
while (l <= c)
{
    //....
    l += 1;
    System.Threading.Thread.Sleep(500 * Math.Min(l, 8));
}