我提供了一个最小的可重现性示例:
#include <iostream>
void Func()
{
static int i = 0;
for (i; i < 5; i++)
{
std::cout << i << "\n";
return;
}
}
int main()
{
Func();
Func();
Func();
}
此输出为“ 0”,“ 0”,“ 0”。我希望它输出“ 0”,“ 1”,“ 2”。我该如何实现?
答案 0 :(得分:6)
问题是{{1}之后紧接着Func()
return
被打印出来,i
(作为{{1}的 iteration_expression }循环)不会被评估。
您可能想要(即使循环似乎在这里也没有意义,该函数在第一次迭代中总是i++
s):
for
或
return
PS:我不确定您的意图,但是正如@FrançoisAndrieux和@ Jarod42所评论的那样,如果您想void Func()
{
static int i = 0;
for (;i < 5;)
{
std::cout << i << "\n";
i++;
return;
}
}
使用void Func()
{
static int i = 0;
for (;i < 5;)
{
std::cout << i++ << "\n";
return;
}
}
或if
似乎更有意义。每次调用while
时都会增加,但不会大于i
。
答案 1 :(得分:3)
您的for loop等效于:
while ( i < 5 ) {
// loop body
std::cout << i << "\n";
return;
// increment
i++;
}
换句话说,您永远不会修改i
,因为您之前return
。如果重新排列上面的while
循环(或完全摆脱循环),则可以获得所需的输出。
答案 2 :(得分:1)
您的for
循环的问题是它永不到达终点(return
语句阻止了这一点)。因此,将不会使用i++
操作,该操作将在循环主体完成后 执行。
要获得所需的输出,同时保持for
循环,您将需要类似以下代码的内容(但这会使循环更加奇怪):
void Func()
{
static int i = 0;
for (; i < 5; ) {
std::cout << i << "\n";
i++;
return;
}
}