【问题标题】:Recursion using main function to print numbers使用main函数递归打印数字
【发布时间】:2015-09-15 21:39:36
【问题描述】:

我正在使用循环打印以下模式:

1 12 123 1234 12345

为什么下面的代码在显示模式之前会显示一些随机值?当我使用递归到某个随机函数 func(int a, int b) 并将值 (1, 1) 从 main 传递给此函数时,它工作正常。

int a=1,b=1;
int main(int a, int b)
{
    if(a>5)
       return 0;

    else if(b<a)
    {
        printf("%d",b);
        main(a,++b);
    }

    else if(b==a)
    {
        printf("%d ",b);
        main(++a,1); 
    } 
}

【问题讨论】:

  • int main(int a, int b) 不是main 的有效签名之一。操作系统调用main,参数数量和参数字符串列表符合预期,你会得到抓取结果。递归调用main 非常令人讨厌,但很少有用。
  • 永远不要自己打电话给main。编写另一个函数并递归调用它。
  • 一个问题..为什么要这样做????使用另一个函数。

标签: c recursion


【解决方案1】:

根据 C 标准1main() 函数的以下签名是有效的:

int main(void)

int main(int argc, char* argv[])

当您将命令行参数传递给main() 函数时(总是至少有一个:程序的名称始终是argv[] 的第一个元素,即argv[0]),您得到奇怪的结果,因为参数被转换为您的整数值。

因此,您应该为递归任务使用自己的函数,例如 int func(int a, int b),正如您所提到的。

1 注意:我的回答有点过于简单了。更详细更准确的描述请参考this answer

【讨论】:

  • 这个答案过于简单化,并不真正正确。 See this.
  • @Lundin:谢谢!我将您的答案链接为详细参考。
【解决方案2】:

int main(int a, int b) 不是 main() 的标准形式之一。

编译器只允许在极少数情况下更改 main() 的类型 (listed here)。如果它这样做了,发生的是实现定义的行为,编译器必须为程序员记录应该如何使用 main。

程序员可能永远不会发明自己的自定义 main 格式。

我非常怀疑是否存在支持和记录 int main(int a, int b) 形式的合规编译器。

您很可能在某些旧编译器上滥用 main 参数缺乏类型安全性,这解释了为什么它甚至首先可以编译。我怀疑你只是在调用未定义的行为,任何事情都可能发生。

由于不允许您发明自己的 main 形式,因为从来没有理由调用 main() 并且因为从来没有理由递归调用它,所以不要这样做。

【讨论】:

  • 问题陈述似乎是递归使用main。只需操作 argc 即可完成此操作,无需更改 argv。
  • @rcgldr 尽管如此,这里唯一重要的是理解为什么你不能也不应该写这样的代码。
  • @Lundin - 我并不是说这将是好的代码,只是标题是“使用 main 函数进行递归......”,我之前在 SO 上看到过。我很好奇这是实际的任务还是 OP 误解了它。
猜你喜欢
  • 2023-02-18
  • 1970-01-01
  • 2020-09-09
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多