2012-06-04 1 views
0

내가, 내가 디버깅 시도하고 볼 수있는 다음 코드 순차적 인 검색 비주얼 C++재귀 함수 오류 데브 - 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; 
} 

에서 그러나 항상 결과 0을 표시 ++ 데브 - C에서 완벽하게 실행 한 지수는 정확하지만 왜 그것은 0을 표시합니까? VC++과 Dev-C++의 차이점은 무엇입니까? 당신은 return 문을 놓쳤다

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); 
} 

+0

재귀 순차 검색 ?? – SuperSaiyan

+8

else else seqSearch (list, index, item);는 아무것도 반환하지 않습니다. 그것을'else return seqSearch (list, index, item);로 변경하십시오. – Vikas

+0

대부분 문제와 관련이 없지만 [여기에 나열된 이유] (http://stackoverflow.com/tags/dev-c%2b%2b/info)에 대한 Dev-C++ 이외의 IDE를 조사하고 싶을 수 있습니다. . – Bart

답변

5

함수 int seqSearch에는 코드 경로 else seqSearch(list, index, item);이 있으며 아무 것도 반환하지 않습니다. 이 값을 else return seqSearch(list, index, item);으로 변경하면 문제가 해결됩니다.

이제 조금 깊게 파고 있습니다. n2960 초안에서

:

§ 6.6.3/2

함수의 끝을 흐르는는 어떤 값으로 복귀 동등하다; 결과적으로 값을 반환하는 함수에서 정의되지 않은 동작이 발생합니다.

따라서 표준에 따라 정의되지 않은 동작입니다.

좀 더 깊이 파고 :

  • 왜 void 이외의 기능이 아닌 컴파일러 오류를 반환하지 않습니다?

모든 코드 경로가 모두 반환되는지 알아보기 위해 코드 경로를 검사하는 것은 어려운 작업이며이를 구현하기 위해 구현할 필요가 없습니다.

  • 이유는 기능적으로

이 아키텍처 및 calling convention 따라 VC++에서 제대로 작동 코드입니다. 다음 코드를 사용해보십시오 : 다른 컴파일러에

#include <iostream> 

int fun (int v) 
{ 
    int a = v; 
} 

int main() 
{ 
    std::cout << fun(5) << std::endl; 
} 

에게 fun 반환하거나 0 또는 어떤 값이 전달 된 기능을. 기본적으로 마지막으로 평가 된 표현식의 값을 반환 할 수 있습니다.

+0

우수 설명. – nikhil

3

올바른 방법을 정의해야한다. 이상적으로 컴파일러는 경고해야하지만 Dev-Cpp가 사용하는 버전에 너무 익숙하지 않습니다.

+0

Vikas가 내 앞에 놓았던 것에 대한 공헌. – nikhil

+0

아직도 내 질문을 보면서 고마워, VC에서 + + 필요가 없습니다 "반환"그것은 여전히 ​​잘 실행, 그 이상한가? –

+0

아니요 구현에 따라 다릅니다. 표준을 준수하려면 return 문이 있어야합니다. 그렇지 않으면 작동하거나 컴파일러에 따라 작동하지 않을 수도 있습니다. – nikhil