在递归过程中,C编译器如何处理堆栈中的局部变量?

在递归过程中,C编译器如何处理堆栈中的局部变量?,c,recursion,stack,C,Recursion,Stack,我编写了一个简单的二进制搜索程序,遇到了一个问题,请参见下面的三个困惑: 如果我选择icc-g main.c或icc-O0 main.c代码返回错误答案,但如果我使用icc-O2 main.c我可以得到正确答案 当代码mid=(beg+end)/2时 返回[mid]-键

我编写了一个简单的二进制搜索程序,遇到了一个问题,请参见下面的三个困惑:

  • 如果我选择
    icc-g main.c
    icc-O0 main.c
    代码返回错误答案,但如果我使用
    icc-O2 main.c
    我可以得到正确答案

  • 当代码
    mid=(beg+end)/2时if(beg键)之前定义code>
    返回[mid]-键<键-a[mid-1]?中期:中期1;
    返回-1;
    }
    内部主(空)
    {
    printf(“%d\n”,改进的二进制搜索(100,0,MAX-1));
    返回0;
    }
    
    一个问题是除非
    beg否则不初始化
    mid
    一个问题是除非
    beg您刚刚声明
    mid
    但没有初始化它,否则不初始化
    mid
    ,如果第一个if条件(
    if(beg您刚刚声明了
    mid
    ,但没有初始化它,如果第一个if条件(
    if(beg)使用编译器警告,
    -Wall
    用于icc,则可能发生这种情况。使用编译器警告,
    -Wall
    用于icc。
    #include <stdio.h>
    #define MAX 6
    int a[MAX] = {1,2,3,4,5,6};
    int improved_binary_search(int key, int beg, int end) {
        int mid, temp;
        //mid = (beg + end) / 2;
        if(beg <= end) {
                 mid = (beg + end ) /2;
                 if(a[mid] == key)
                         return mid;
                 if(a[mid] < key)
                         return improved_binary_search(key, mid + 1, end);
                  if(a[mid] > key)
                          return improved_binary_search(key, beg, mid - 1);
                  //printf("test is %d\n", mid);
          }
          if(mid == 0)
                  return 0;
          if(mid == MAX - 1)
                  return MAX - 1;
          if(a[mid] < key)
                  return a[mid+1] - key < key - a[mid] ? mid+1 : mid;
          if(a[mid] > key)
                  return a[mid] - key < key - a[mid-1] ? mid : mid-1;
          return -1;
      }
    
    int main(void)
    {
         printf("%d\n", improved_binary_search(100, 0, MAX - 1));
         return 0;
    }