Stati c Переменная & Для Петли - PullRequest
4 голосов
/ 06 апреля 2020

Я создал минимально воспроизводимый пример моей проблемы:

#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 ]

6 голосов
/ 06 апреля 2020

Проблема в том, что Func() return с сразу после распечатки i, i++ (как выражение iteration_expression из for l oop) вообще не оценивается .

Вы можете захотеть (даже l oop здесь кажется бессмысленным, функция всегда return s на 1-й итерации):

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;
    }
}

PS: Я не уверен в ваших намерениях, но, как прокомментировали @ FrancoisAndrieux и @ Jarod42, использование if или while кажется более целесообразным, если вы хотите, чтобы i увеличивалось каждый раз Func() называется, но не будет больше 5.

3 голосов
/ 06 апреля 2020

Ваш для l oop эквивалентен:

while (  i < 5 ) {
    // loop body
    std::cout << i << "\n";
    return;
    // increment
    i++;    
} 

Другими словами, вы никогда не изменяете i, потому что раньше return. Вы можете получить желаемый результат, если переставите вышеприведенный while l oop (или вообще избавитесь от l oop).

1 голос
/ 06 апреля 2020

Проблема с for l oop заключается в том, что никогда не достигает своего конца (оператор return предотвращает это). Таким образом, операция i++, которая будет выполнена после завершения тела l oop, никогда не используется.

Для достижения желаемого результата, но с сохранением for l oop, вам понадобится что-то вроде следующего кода (но это делает l oop еще более странным):

void Func()
{
    static int i = 0;
    for (; i < 5; ) {
        std::cout << i << "\n";
        i++;
        return;
    }
}
...