静态变量与循环

时间:2020-04-06 16:10:15

标签: c++ static

我提供了一个最小的可重现性示例:

#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”。我该如何实现?

3 个答案:

答案 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;
    }
}
相关问题