中的多个语句
本文关键字:语句 | 更新日期: 2023-09-27 18:32:29
我有这个代码
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>
一个有趣的选择:
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));
}