c - 如果在递归返回函数中不使用 return 会发生什么?

标签 c recursion

#include <stdio.h>
int lcm(int ,int );
int main()
{
   int a,b,f;
   printf("Enter the numbers:");
   scanf("%d %d",&a,&b);
   f=lcm(a,b);
   printf("LCM of %d and %d : %d",a,b,f);
   return 0;
}

int lcm(int a,int b)
{
    static int x=1;
    if(x%a==0 && x%b==0)
        return x;
    x++;
    lcm(a,b);
}

现在,这段代码没有给出任何错误......并给我正确的答案,但是如何在 lcm 函数中没有返回键盘的情况下将值返回到 main 函数 "lcm(a,b); "!!请解释!!

最佳答案

Now, this code isn't giving any error ... and giving me correct answer but how the value is being return to main function without the return keyboard in lcm function lcm(a,b);

C 语言允许不正确的代码,让你搬起石头砸自己的脚。这叫做 undefined behaviour .您的代码对除 (1,1) 以外的任何参数都表现出未定义的行为。当您通过 (1,1) 时,第一次返回会第一次被触发。

你应该阅读 What Every C Programmer Should Know About Undefined Behavior以获取带有示例的详细说明。

话虽如此,忽略返回值本身并不是未定义的行为。 只有 undefined 调用者使用函数的返回值。 例如,您已经在代码中忽略了 scanf()printf() 函数的返回值,但它们是有效的。不过,如果扫描成功,您应该检查 scanf() 的返回值!在相关说明中,scanf() use is discouraged in C因为它很容易出错。

但是在您的代码中,您确实使用了返回值 (f=lcm(a,b);)。因此,存在未定义的行为(除了上述异常)。

但是如果您要将对 lcm() main 的调用编写为:

 scanf("%d %d",&a,&b);
 lcm(a,b);
 ...

那么就不会有任何未定义的行为(尽管它不会在你的程序中有用)。

关于c - 如果在递归返回函数中不使用 return 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40554434/

相关文章:

c - 在下面的代码中,static 的作用是什么?

c - 如何在两个节点之间的循环图中找到最长路径?

c - 在 opencv 中使用线程

algorithm - 递归算法 : suggested patterns and practices?

python - 如何手动确定复杂递归函数的输出

c - 使用 C 将逗号分隔的文本文件数据扫描到数组中

c - 如何只比较数据类型中的某些位?

C 编程 - 递归的两个 for 循环

c - 8Queen 代码不起作用

c++ - 如何解决由递归函数引起的堆栈溢出错误? C++