不能转换来自' int'到' int&'

时间:2018-03-06 07:30:10

标签: c++ recursion

void cnt_cif(int n, int k, int &c)
{
    if (n != 0)
    {
        if (n % 10 > k)
            cnt_cif(n / 10, k, c + 1);
    }
}

int main()
{
    int n, k, c=0;

    cin >> n >> k;

    cnt_cif(n, k, c);

    cout << c;

    return 0;
   }

错误

Severity    Code    Description Project File    Line    Suppression State
Error   C2664   'void cnt_cif(int,int,int &)': cannot convert argument 3 from 'int' to 'int &'  


Severity    Code    Description Project File    Line    Suppression State
Error (active)  E0461   initial value of reference to non-const must be an lvalue   

问题似乎在第11行

5 个答案:

答案 0 :(得分:2)

要使用c作为输出参数,您需要在函数中重新分配它。然后,您可以在进行递归调用时传递更新的变量。

#include <iostream>
using namespace std;

void cnt_cif(int n, int k, int &c)
{
    if (n != 0)
    {
        if (n % 10 > k) {
            c++;
            cnt_cif(n / 10, k, c);
        }
    }
}

int main()
{
    int n, k, c=0;

    cin >> n >> k;

    cnt_cif(n, k, c);

    cout << c << '\n';

    return 0;
}

答案 1 :(得分:1)

c+1这样的r值无法初始化像c这样的l值引用。预增量运算符++返回引用,因此您可以使用它来代替{{ 1}}。是否修复使得能够完成你想要的功能是另一个问题。

c+1

答案 2 :(得分:0)

我很抱歉含糊不清的细节。我终于弄明白了

void cnt_cif(int n, int k, int &c)
{
if (n != 0)
{
    if (n % 10 > k)
        cnt_cif(n / 10, k, ++c);
    else
        cnt_cif(n / 10, k, c);
}
}

int main()
{
int n, k, c=0;

cin >> n >> k;

cnt_cif(n, k, c);

cout << c;

return 0;
}

答案 3 :(得分:-1)

也许这就是你的意思? 已编辑以整理@Default

突出显示的逻辑
int cnt_cif(int n, int k)
{
    int c;
    if (n != 0) {
        c = (n % 10 > k) ? 1 : 0;
        return cnt_cif(n / 10, k) + c;
    }
    return 0;
}

int main()
{
    int n, k;
    cin >> n >> k;
    cout << cnt_cif(n, k);
    return 0;
}

编辑2

对于它的价值,如果有人感兴趣,上面的内容已被修改为保持尾递归。此外,它已经过修改,以确保正确处理n的负值。

int cnt_cif(int n, int k)
{
    int m = n < 0 ? -n : n;
    int c = (m != 0 && m % 10 > k) ? 1 : 0;
    return (m == 0) ? 0 : c + cnt_cif(m / 10, k);
}

int main()
{
    int n, k;
    cin >> n >> k;
    cout << cnt_cif(n, k);
    return 0;
}

答案 4 :(得分:-2)

所以你试图将c传递给函数,该函数以递归方式调用自身,然后在递归结束后打印c。您的方法似乎是将c传递给每次调用以将结果存储在其中。你的问题,也导致错误,你的函数void cnt_cif(int n, int k, int &c)的签名将一个指向int的指针作为它的第三个参数,但在main中你给它一个int值。

int n, k, c=0;
cnt_cif(n, k, c);

你需要做的是给它指向值

的指针
cnt_cif(n, k, &c);

还在你的函数中更改c的值然后再次使用指针作为参数

if (n != 0){
    if (n % 10 > k){
        c += 1;
        cnt_cif(n / 10, k, &c);
    }
}

一个函数将一个值作为复制的参数,对函数内部值的任何更改都不会影响初始值。如果使用指针作为参数,指针将被复制,但它指向的值完全相同,并且更改为将影响原始指针。