我有这段代码
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#中的方式相同?
答案 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));
}