for的多个语句

时间:2016-01-29 10:43:52

标签: c# c++

我有这段代码

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#中的方式相同?

7 个答案:

答案 0 :(得分:4)

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

所以等价是

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

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

答案 1 :(得分:2)

它们不等同,因为for循环的第三部分在每个循环结束时执行。根据{{​​3}},这是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
}

答案 2 :(得分: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));
} 

答案 3 :(得分:1)

没有。您的原始代码等同于

{
    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(),而不是在它之后调用。

答案 4 :(得分:0)

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

请注意int l = 1更改为int l = 0,因为您将提前一个计数,因此您必须通过减少一个计数来计算它。所以我将l设为0

答案 5 :(得分:0)

一个有趣的选择:

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

与Gabriel的答案类似,但是+ 1被移动到边界检查,这使得其余部分看起来相同。 (将代码添加到l时,代码会感到怀疑,以弥补“遗漏”增量。

由于问题还在于将代码移植到C#,这里是相关的信息。虽然您的两个代码示例不相同,但它们都直接转换为C#代码(当然,C#相当于Sleep)。对于C#,the docs中更复杂的示例清楚地表明,当for循环的迭代器部分包含多个表达式时,它们将从左到右进行求值。在C ++中,内置的逗号运算符也从左到右进行评估(请参阅“内置逗号运算符”下的here)。

答案 6 :(得分:0)

我认为对于C#&#39;有一些混淆。这里循环 - C# 允许相同类型的&#39; for&#39;循环作为原始(C ++?)代码(即第三部分中的多个语句):

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

如果你想用另一种的方式写这篇文章 - 即使它是&#39; for&#39;上面的循环工作:

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