递归函数错误 Dev-C++

recursive function error Dev-C++

本文关键字:Dev-C++ 错误 递归函数      更新时间:2023-10-16

我有以下代码顺序搜索在Visual C++中完美运行

#include<iostream>
using namespace std;
int seqSearch(int list[], int length, int item)
{
    int index = length-1;
    if (index < 0)
        return -1;
    if (list[index] == item)
        return (index);
    else seqSearch(list, index, item);
} // end seqSearch
int main () 
{
    int const length = 10;
    int item;
    int list[10] = { 2, 3, 4, 5, 20, 40, 80, 45, 99, 0};
    cout << "Please enter the value to be searched: ";
    cin>> item;
    if (seqSearch(list, length, item) == -1) cout << "Item not found." << endl;
    else cout <<"Item found at position: " << seqSearch(list, length, item) << " of list *Note: (first index of list start at 0)" << endl;
    system("pause");
    return 0; 
}

但是在 Dev-C++ 中它总是显示结果 0,我尝试调试并查看索引是否正确,但为什么它显示 0?为什么我们在VC++和Dev-C++之间有这种差异?

函数

int seqSearch有一个代码路径,else seqSearch(list, index, item);不返回任何内容。将其更改为else return seqSearch(list, index, item);应该可以解决问题。

现在挖得有点深。

从 n2960 草案:

§ 6.6.3/2

从函数末尾流出等效于没有值的返回;这会导致值返回函数中出现未定义的行为。

因此,根据标准,这是一种未定义的行为。

深入

挖掘:

  • 为什么不从非 void 函数返回不是编译器错误?
检查所有代码路径

以确定是否所有代码路径都返回是一项困难的操作,不需要实现来检查这一点。

  • 为什么代码在 VC++ 中功能正常

这依赖于体系结构和调用约定。尝试以下代码:

#include <iostream>
int fun (int v)
{
    int a = v;
}
int main ()
{
    std::cout << fun(5) << std::endl;
}

在不同的编译器上,函数fun返回0或传递给它的任何值。基本上它可以返回上次计算表达式的值。

正确的方法定义应该是

int seqSearch(int list[], int length, int item)
{
    int index = length-1;
    if (index < 0)
        return -1;
    if (list[index] == item)
        return (index);
    else return seqSearch(list, index, item);
} 

您错过了返回语句。理想情况下,编译器应该警告您,但我不太熟悉 Dev-CPP 使用的版本。