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

Если использовать такой код:

void outputResultsCalculation(double initialX, double finalX, double stepX, double epsilon)
{
   double deltaX = initialX, amountRow;
   int numberMemberRow;

   for (deltaX; checkValuesX(stepX, deltaX, finalX); deltaX += stepX)
   {
       amountRow = 0;
       numberMemberRow = 0;

       cout << deltaX << ":\n"
           << "Функция: " << log(1 - deltaX) << endl
           << "Цикл: " << getSumRowCycle(deltaX, epsilon) << endl
           << "Рекурсия: " << getSumRowRecursion(deltaX, amountRow, numberMemberRow, epsilon) << 
"\nВызывается: " << numberMemberRow << " раз\n";
       cout << endl;
   }
}

то переменная numberMemberRow будет выводить 0, а если такой:

void outputResultsCalculation(double initialX, double finalX, double stepX, double epsilon)
{

double deltaX = initialX, amountRow;
int numberMemberRow;

for (deltaX; checkValuesX(stepX, deltaX, finalX); deltaX += stepX)
{
    amountRow = 0;
    numberMemberRow = 0;

    cout << deltaX << ":\n"
        << "Функция: " << log(1 - deltaX) << endl
        << "Цикл: " << getSumRowCycle(deltaX, epsilon) << endl
        << "Рекурсия " << numberMemberRow << " раза вызывается\nРезультат: " << 
    getSumRowRecursion(deltaX, amountRow, numberMemberRow, epsilon) << endl;
    cout << endl;
    }
}

то все нормально будет выводиться. Переменная numberMemberRow подсчитывает количество вызовов рекурсивной функции, вот ее код:

double getSumRowRecursion(double deltaX, double& amountRow, int& numberMemberRow, double epsilon)
{
numberMemberRow++;
double memberRow = pow(deltaX, numberMemberRow) / -numberMemberRow;

if (abs(memberRow) >= epsilon && numberMemberRow <= 3970)
{
    amountRow += memberRow;
    return getSumRowRecursion(deltaX, amountRow, numberMemberRow, epsilon);
}
else
    return amountRow;

}


Ответы (1 шт):

Автор решения: Harry

Думаю, ваш компилятор еще не знает, что в С++17 вычисления в цепочке << должны выполняться в том порядке, в котором записаны, и пользуется своим правом вычислять их так, как это ему удобно - например, сначала взяв значение numberMemberRow для вывода, а уже потом вычисляя getSumRowRecursion. Попробуйте разбить вывод на части, типа:

cout << deltaX << ":\n"
     << "Функция: " << log(1 - deltaX) << endl;
cout << "Цикл: " << getSumRowCycle(deltaX, epsilon) << endl;
cout << "Рекурсия: " << getSumRowRecursion(deltaX, amountRow, numberMemberRow, epsilon);
cout << "\nВызывается: " << numberMemberRow << " раз\n";
→ Ссылка