最近在复习408关于二分查找时,看到一个使用递归实现的方法。代码并不难实现。但是在写完这段代码后,发现一个问题。我在递归中并没有及时return结果。但是结果却是正确的
下面贴上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <bits/stdc++.h>
using namespace std;
int BinSearchRec(int *ST, int key, int low, int high);
int main()
{
int st[10] = {3,6,8,11,15,18,20,21,25,30};
cout << BinSearchRec(st, 15, 0, 9) << endl;//查找15在数组中的位置
//结果为4
}

int BinSearchRec(int *ST, int key, int low, int high)
{
if (low > high)
return 0;
int mid = (low + high) / 2;
// 取中间位置
if (key > ST[mid]) // 向后半部分查找
//少了return
BinSearchRec(ST, key, mid + 1, high);
else if (key < ST[mid]) // 向前半部分查找
//少了return
BinSearchRec(ST, key, low, mid - 1);
else
return mid;
// 查找成功
}

于是对在非 void 函数中不写 return 的情况产生了好奇:莫不是编译器会只能返回写在代码块中的最后一个变量?(有些高级语言是支持这样子的操作的)。
经检验后发现错了ε(┬┬﹏┬┬)3
所以在这里公布一下答案,并说明一下原因。
在这样子的函数中,他会默认把存放于寄存器exa中的数据作为返回值返回到调用该函数的地方。

提供一个小工具c->汇编小工具

所以我们是误打误撞得到的正确的结果,从汇编的结果来看
GCC-中在非-void-函数中不写-return-的情况-2024-11-08-18-22-28
只是刚好这个结果返回时存放到了exa寄存器中,同时也只有这个地方修改了exa寄存器。因此使结果刚好对了。

在一些高级一些的IDE中,都会直接warning,不会出现这样子的错误。