首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不使用“返回”命令返回

不使用“返回”命令返回
EN

Stack Overflow用户
提问于 2020-02-14 09:54:47
回答 3查看 144关注 0票数 8

C程序设计语言,用WSL的终端bash gcc编写。

我编写了一个递归函数,以在数组中找到最低的数字,它工作得很好。

代码语言:javascript
运行
复制
/*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*/    }

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

代码语言:javascript
运行
复制
int main()
{
    //Var
    int array[N] = {10, 2, 5, 1, 7};
    printf("Min: %d\n", minimo(array, 0));
}

我的担心实际上是一个问题,但不是在我的机器上,因为它的功能运行得很好;这是我朋友的笔记本电脑和IDE上的一个问题,我试着在朋友的Macbook上复制XCode,如果函数末尾没有添加"return;“行,它就不能工作。

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

代码语言:javascript
运行
复制
/*15*/      }
            return min;
/*16*/    }

“我的问题”给您的内容如下:

  1. 函数如何返回变量automatically__?
  2. 它有可能只返回我创建的变量(静态int )吗?
  3. 还是与变量所具有的静态属性相关的“问题”?
  4. 它与函数(recursive)?的性质有关吗?

这是我的第一篇帖子,如果我违反了任何论坛规则,请见谅。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-14 10:16:59

我的担心实际上是一个问题,但不是在我的机器上,因为它的功能运行得很好;这是我朋友的笔记本电脑和IDE上的一个问题,我试着在朋友的Macbook上复制XCode,如果函数末尾没有添加"return;“行,它就不能工作。

未定义行为的典型例子。在一台机器上工作,而不是另一台。白天工作但晚上不行。使用一个编译器,而不是另一个编译器。当您调用未定义的行为时,C标准没有对代码的行为提出任何要求。

C11标准6.9.1.12

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

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

与许多人所认为的相反,它完全允许在非空函数中省略返回语句。只有尝试使用不存在的返回值时,它才会成为未定义的行为。

为了避免这种情况,请始终使用至少-Wall -Wextra进行编译。

票数 5
EN

Stack Overflow用户

发布于 2020-02-14 11:25:44

函数如何自动返回变量?

它遵循协议。它知道函数的返回应该在某个位置找到返回的值,而来自该函数的显式return将填充该位置。如果不调用return,则会在给定位置保留一些随机值。

它是否可能返回我创建的唯一变量(静态int )?

不,它返回的是未知的。它可以是什么。

还是与变量所具有的静态属性相关的“问题”?

同样,它返回的内容也是未知的。

它与函数(递归)的性质有任何关系吗?

是也不是。如果函数被定义为外部函数,则返回的值遵循另一个协议,就像静态函数一样。

在最后的代码中,它可以发生任何事情,C语言并不强加函数的实现方式,不管它是递归的还是非递归的。例如,如果函数是递归的,并且可以预先计算,则只能在调用的位置替换最后的值。这也是正确的,因为程序的最终结果是预期的结果,符合在ISO9899中定义C的操作语义。

我引用正式文件的话:

4在抽象机器中,所有表达式都由语义指定。实际的实现不需要评估表达式的一部分,如果它可以推断它的值没有被使用,并且没有产生任何所需的副作用(包括调用函数或访问易失性对象所引起的任何副作用)。

它还可以将调用替换为该调用的值,这是正确的。

所以,在你们所有的问题中,答案都是未定义的行为。

票数 2
EN

Stack Overflow用户

发布于 2020-02-14 10:26:56

函数如何自动返回变量?

我偶然发生了,min变量恰好在ABI的正确返回寄存器中。

它是否可能返回我创建的唯一变量(静态int )?

我认为它与在函数退出之前使用它更相关,但我在这里猜测:这不是C语言定义的行为,它是偶然的。

还是与变量所具有的静态属性相关的“问题”? 它与函数(递归)的性质有任何关系吗?

既然这是一种偶然的行为,可能是,也可能不是。随机变量和确定性变量之间的区别在于,你有太多的变量而放弃解释。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60223919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档