Случай 1: когда я поместил i ++ в параметр функции в это время, я получил пустой вывод

Случай 2: когда я поставил i + 1, а не i ++, тогда я получил правильный результат

#include <iostream>
using namespace std;

 
int foccurance(int arr[], int n, int i, int key)
{
    if (arr[i] == key)
    {
        return i;
    }
    if (i == n)
    {
        return -1;
    }
  ///here rather than i++ if i put i+1 then it runs properly
    return foccurance(arr, n, i++, key);
}

int main()
{
    int ar[] = {2, 5, 7, 4, 5, 6, 7};
    int n = sizeof(ar) / sizeof(int);
    int k;

    cout << "key val=" << endl;
    cin >> k;

    int ind = foccurance(ar, n, 0, k);
    cout << "your value is at index=" << ind;
    return 0;
}
c++
0
ROCKY 007 5 Июл 2021 в 17:03

3 ответа

Лучший ответ

Выражения i++ и i+1 оценивают разные вещи, и после операций i будет содержать разные значения.

void f(int v)
{
    std::cout << v << std::endl;
}

int i = 0;
f(i+1); // Prints 1
std::cout << i << std::endl; // Prints 0
f(i++); // Prints 0
std::cout << i << std::endl; // Prints 1.

Итак i+1

  • не будет изменять i, но
  • он будет оценивать значение, которое на 1 больше, чем i.

С другой стороны, i++

  • изменит i и установит его на i+1,
  • но он будет оценивать исходное значение i перед добавлением к нему 1.
1
Markus Mayr 5 Июл 2021 в 14:12

Вы должны использовать оператор предварительного приращения, например ++ i

i++ means i=i+1 and it is a post increament operator.

Поэтому, когда вы передаете i ++ в параметре функции, он передает предыдущее значение и затем увеличивает его на 1. Таким образом, всегда значение i равно 0. Но оператор предварительного увеличения сначала увеличивает значение vaue, а затем передает его значение в аргумент функции. Вы должны написать такой код:

    #include <iostream>
    using namespace std;
    
    
    int foccurance(int arr[], int n, int i, int key)
    {
        if (arr[i] == key)
        {
            return i;
        }
        if (i == n)
        {
            return -1;
        }
        return foccurance(arr, n, ++i, key);
    }
    
    int main()
    {
        int ar[] = {2, 5, 7, 4, 5, 6, 7};
        int n = sizeof(ar) / sizeof(int);
        int k;
    
        cout << "key val=" << endl;
        cin >> k;
    
        int ind = foccurance(ar, n, 0, k);
        cout << "your value is at index=" << ind;
        return 0;
    }
0
Shakib hasan 5 Июл 2021 в 14:32

Используйте ++i или i+1 вместо i++, потому что: в основном ++i возвращает значение после его увеличения, а i++ возвращает значение перед ним увеличивается.

i++ -> «присваивает» -> увеличивает.

++i -> приращения -> «присваивает».

Поэтому согласно вашей программе 0 передается каждый раз, следовательно, он становится бесконечной рекурсией, и программа не выполняется.

0
Jarod42 5 Июл 2021 в 16:15