C程序设计语言,用WSL的终端bash gcc编写。
我编写了一个递归函数,以在数组中找到最低的数字,它工作得很好。
/*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“返回给调用者.
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;。
/*15*/ }
return min;
/*16*/ }“我的问题”给您的内容如下:
这是我的第一篇帖子,如果我违反了任何论坛规则,请见谅。
发布于 2020-02-14 10:16:59
我的担心实际上是一个问题,但不是在我的机器上,因为它的功能运行得很好;这是我朋友的笔记本电脑和IDE上的一个问题,我试着在朋友的Macbook上复制XCode,如果函数末尾没有添加"return;“行,它就不能工作。
未定义行为的典型例子。在一台机器上工作,而不是另一台。白天工作但晚上不行。使用一个编译器,而不是另一个编译器。当您调用未定义的行为时,C标准没有对代码的行为提出任何要求。
如果到达终止函数的},并且调用方使用函数调用的值,则该行为是未定义的。
在您的代码中,这正是所发生的事情。在尝试打印返回值时调用未定义的行为。
与许多人所认为的相反,它完全允许在非空函数中省略返回语句。只有尝试使用不存在的返回值时,它才会成为未定义的行为。
为了避免这种情况,请始终使用至少-Wall -Wextra进行编译。
发布于 2020-02-14 11:25:44
函数如何自动返回变量?
它遵循协议。它知道函数的返回应该在某个位置找到返回的值,而来自该函数的显式return将填充该位置。如果不调用return,则会在给定位置保留一些随机值。
它是否可能返回我创建的唯一变量(静态int )?
不,它返回的是未知的。它可以是什么。
还是与变量所具有的静态属性相关的“问题”?
同样,它返回的内容也是未知的。
它与函数(递归)的性质有任何关系吗?
是也不是。如果函数被定义为外部函数,则返回的值遵循另一个协议,就像静态函数一样。
在最后的代码中,它可以发生任何事情,C语言并不强加函数的实现方式,不管它是递归的还是非递归的。例如,如果函数是递归的,并且可以预先计算,则只能在调用的位置替换最后的值。这也是正确的,因为程序的最终结果是预期的结果,符合在ISO9899中定义C的操作语义。
我引用正式文件的话:
4在抽象机器中,所有表达式都由语义指定。实际的实现不需要评估表达式的一部分,如果它可以推断它的值没有被使用,并且没有产生任何所需的副作用(包括调用函数或访问易失性对象所引起的任何副作用)。
它还可以将调用替换为该调用的值,这是正确的。
所以,在你们所有的问题中,答案都是未定义的行为。
发布于 2020-02-14 10:26:56
函数如何自动返回变量?
我偶然发生了,min变量恰好在ABI的正确返回寄存器中。
它是否可能返回我创建的唯一变量(静态int )?
我认为它与在函数退出之前使用它更相关,但我在这里猜测:这不是C语言定义的行为,它是偶然的。
还是与变量所具有的静态属性相关的“问题”? 它与函数(递归)的性质有任何关系吗?
既然这是一种偶然的行为,可能是,也可能不是。随机变量和确定性变量之间的区别在于,你有太多的变量而放弃解释。
https://stackoverflow.com/questions/60223919
复制相似问题