我不明白这是怎么回事..
#include <iostream>
#include <vector>
using namespace std;
template<class T>
int binarySearch(const vector<T>& vect, const T& k, int i, int j) {
int m;
if(i > j) {
return -1;
}
m = (i+j) / 2;
if(vect[m] == k) {
return m;
} else {
if(k < vect[m]) {
binarySearch(vect, k, i, m-1); // No return statement
} else {
binarySearch(vect, k, m+1, j); // No return statement
}
}
}
int main() {
vector<int> vect = {10, 15, 21, 30, 40, 60, 100};
int pos = binarySearch(vect, 60, 0, vect.size()-1);
cout << pos << endl; // prints 5
return 0;
}
为什么即使函数调用中省略了返回,这个二进制搜索函数也能正常工作?我脑海中唯一想到的是,当调用return m时,返回的数据会返回堆栈,因为中间的函数没有返回任何内容。
在第一次我虽然它是某种VS优化/重构(VS2015显然允许void main()
所以我认为它可能是),但即使在Eclipse中也会发生这种情况。这是编译器选项
g++ -c -fmessage-length=0 -std=c++11
我刚刚发现它的情况,我永远不会认为这样的事情会在递归发生的情况下起作用。
我在其他问题的答案中读到了缺少return语句在ISO C ++中被称为未定义的行为,但是是否存在递归函数或者这只是未定义行为的另一种情况?