不带“返回”命令返回

lnk*_*nk3 8 c recursion gcc return windows-subsystem-for-linux

C语言,gcc编译,WSL终端bash

我编写了一个递归函数,用于查找数组中的最小数,效果很好。

/*01*/    int minimo(int array[], int n)
/*02*/    {
/*03*/      static int min = 0;
/*04*/    
/*05*/      if (n == N)
/*06*/      {
/*07*/          return array[n-1];
/*08*/      }
/*09*/      else
/*10*/      {
/*11*/          min = minimo(array, n+1);
/*12*/          if(array[n]<min){
/*13*/              min = array[n];
/*14*/          }
/*15*/      }
/*16*/    }
Run Code Online (Sandbox Code Playgroud)

唯一的问题是它不应该工作,因为它不会将“min”返回给调用者......

int main()
{
    //Var
    int array[N] = {10, 2, 5, 1, 7};
    printf("Min: %d\n", minimo(array, 0));
}
Run Code Online (Sandbox Code Playgroud)

我的担忧实际上是一个问题,但不是在我的机器上,该功能可以正常工作;这是我朋友的笔记本电脑和 IDE 上的一个问题,我尝试在朋友的 Macbook 上复制到 XCode,但如果“return min;”这一行就无法工作。未在函数末尾添加。

在第 15-16 行之间,我必须添加 return min;

/*15*/      }
            return min;
/*16*/    }
Run Code Online (Sandbox Code Playgroud)

我的问题如下:

  1. 函数如何自动返回变量?
  2. 它是否有可能返回我创建的唯一变量(静态 int min)?
  3. 还是与变量具有的静态属性相关的“问题” ?
  4. 它与函数的性质(递归)有什么关系吗?

这是我的第一篇文章,如果我违反了任何论坛规则,请多多包涵。

klu*_*utt 5

我的担忧实际上是一个问题,但不是在我的机器上,该功能可以正常工作;这是我朋友的笔记本电脑和 IDE 上的一个问题,我尝试在朋友的 Macbook 上复制到 XCode,但如果“return min;”这一行就无法工作。未在函数末尾添加。

未定义行为的典型例子。在一台机器上工作,但不能在另一台机器上工作。白天有效,夜间无效。适用于一个编译器但不适用于另一个编译器。当您调用未定义的行为时,C 标准对代码的行为方式没有任何要求。

C11 标准 6.9.1.12

如果到达终止函数的 },并且调用者使用了函数调用的值,则行为未定义。

在您的代码中,这正是发生的事情。当您尝试打印返回值时,您会调用未定义的行为。

与许多人认为的相反,完全允许在非 void 函数中省略 return 语句。如果您尝试使用不存在的返回值,它只会变成未定义的行为。

为避免这种情况,请始终使用至少-Wall -Wextra.

  • 也许 GCC 默认情况下应该简单地以 HTML 格式显示带有 Stack Overflow 主题的错误消息,并嵌入搜索结果 (2认同)