多次调用main函数是C中的一个好习惯吗?

Ant*_*t's 3 c

我看到了这样的C代码:

#include <stdio.h>

void main  ()
{
    static int ivar = 5;
    printf ("%d", ivar--);

    if (ivar)
        main ();
}
Run Code Online (Sandbox Code Playgroud)

哪个输出:

54321
Run Code Online (Sandbox Code Playgroud)

我是C的新手,我想在条件失败之前,这个main 方法会一次又一次地被调用.由于我是C的新手,main在上述情况下多次调用函数是不错的做法?有没有真实世界的案例,这种代码非常有用?

提前致谢.

cyc*_*130 8

在您的示例中,它无关紧要,因为它只是一小段代码.但在一般情况下,我认为召唤main是一个坏主意,原因如下:

  • 可读性.在检查程序时,没有人会认为main会在某一点被调用.当你看到它时,你必须回溯并重读整个事物.此外,main在不清楚递归的意图是什么的意义上,它不是一个有意义的名称.所以我会写一个有意义的名字的另一个函数来反映这一点.
  • 可重用性.具有有意义名称的新函数很可能在复杂程序中的多个位置有用.
  • 命令行参数.有时您可能需要在程序中使用命令行参数.甚至GUI程序也需要它们(用于文件关联等).并且您需要重新调整对main的所有调用以将其考虑在内.
  • C++兼容性.这在C++中是非法的.


Kev*_*vin 7

我会说很少,如果有的话,最好调用这个main函数.如果您要进行递归,请创建一个函数来执行此操作.

  • 好的.但你为什么这么说呢? (2认同)
  • @BenjaminLindley`main`不仅仅是任何旧函数,它是特殊的,具有明确定义的目的:启动程序,而不是它的明确部分.我可以想象一个编译器甚至不会将它作为一个独立的"函数"处理,从而无法调用它. (2认同)

spr*_*aff 6

while循环更合适.当每次递归时,你正在做一个不同的工作 - 通常是一个较小的工作,递归是有道理的.

这段代码真正做的是演示函数本地静态变量:ivar只在第一次调用时初始化main.每次递归时,尽管有ivar=5声明,它都会递减.

main有特殊意义.在惯用语中,它应该初始化环境,然后调用一些驱动应用程序逻辑的其他函数.

无论如何,优化编译器可能会将该代码转换为迭代版本.