gpt4 book ai didi

c++ - 为什么通过引用传递可以修复我的递归错误?

转载 作者:行者123 更新时间:2023-11-30 01:16:19 26 4
gpt4 key购买 nike

我刚开始学习递归,我有一个程序可以在 5 个整数的 vector 中搜索一个值并返回该值的下标位置。我注意到当我按值传递 vector 时,我得到了一个不正确的下标位置,例如 72784658。

但是,当我通过引用传递 vector 时,不做任何更改,我得到了正确的答案。有人可以解释为什么吗?下面是 vector 按值传递的代码,它产生了错误的答案。

#include <vector>
#include <iostream>
using namespace std;

int search( vector<int>, int, int );

int main()
{
vector<int> myInts;
for( int i = 0; i < 5; i++ )
myInts.push_back( i );

cout << "The number 2 is at subsript " << search( myInts, 2, 0 ) << endl;

return 0;
}

int search( vector<int> vec, int val, int index )
{
if( index < vec.size() )
{
if( vec[index] == val )
return index;
else
search( vec, val, index + 1 );
}
else
return -1;
}

最佳答案

你递归,但不返回递归调用的值:

search( vec, val, index + 1 );
// Should be this:
return search( vec, val, index + 1 );

这会导致在不返回任何特定值的情况下到达函数的末尾,因此任何结果都是可能的,包括没有结果。流程到达非 void 函数的末尾而没有遇到 return 语句是未定义的行为,因此编译器让您的程序在该点崩溃是合法的。

vec 更改为引用可能会导致 index 参数占用不同的 CPU 寄存器,可能是用于将值返回给调用者的寄存器。这可以解释为什么当您将 vec 更改为引用时它似乎可以工作,但是升级您的编译器、更改您的编译器选项或使用不同的编译器可能会产生完全不同的结果。因此,即使它以您想要的方式工作,也只是一个幸运的巧合。

作为旁注,始终在启用所有可能的警告的情况下进行编译,我还建议将所有警告都设为错误 (-Wall -pedantic)。使用这些选项,此代码甚至无法编译。

关于c++ - 为什么通过引用传递可以修复我的递归错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26874108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com