Печать переменных c ++ с другими переменными меняет значение - PullRequest
0 голосов
/ 01 августа 2020

почему значение переменной счетчика становится равным 0, когда оно печатается в первый раз, а затем, когда оно печатается только во второй раз, оно показывает правильное значение?


//global counter variable 
int counter = 0;

int fibo(int n){
    counter++;
    if(n<=1)
        return n;
    else
        return fibo(n-1) + fibo(n-2);
}

int main()
{
    for(int i = 0;i<10;i++){
        counter = 0;
        std::cout << i << " " << fibo(i) << " " << counter << std::endl; 
        std::cout << counter << std::endl;
    }    
}

Результат:

0 0 0 1 1 1 0 1 2 1 0 3 3 2 0

1 Ответ

2 голосов
/ 01 августа 2020

Вы не знаете, в каком порядке происходят события. В частности, вы делаете предположения о порядке вещей в своем cout << заявлении, которое не обосновано.

Происходит что-то вроде следующего

1) The value of `counter` is checked and saved somewhere (the value is zero)
2) `fibo` is called are the result saved somewhere (now `counter` has been incremented)
3) The saved result from `fibo` is printed
4) The saved value of `counter` is printed

Это все совершенно законно до C + +17. В C ++ 17 был изменен язык, в котором говорится, что левая часть << должна оцениваться перед правой. Итак, если ваш компилятор установлен на C ++ 17, вы должны получить ожидаемый результат.

С моим компилятором MSV C 2019 и с языком, установленным на C ++ 17, я получаю правильный результат для C + + 17.

0 0 1
1
1 1 1
1
2 1 3
3
3 2 5
5
...