代码之家  ›  专栏  ›  技术社区  ›  sree

C中返回的main(++i)是什么

  •  -9
  • sree  · 技术社区  · 10 年前

    我有一个这样的程序。

    ‪#include<stdio.h>
    #include<stdlib.h>
    
    int main(int i) {                /* i will start from value 1 */
    if(i<10)                        
    printf("\n%d",main(++i));        /* printing the values until i becomes 9 */    
    }
    
    output : 
    5
    2
    2
    2
    

    有人能解释一下输出是怎么来的吗??每次迭代返回的main(++i)是什么。 如果我删除printf函数中的\n,它也会产生输出5111。 提前感谢。

    6 回复  |  直到 10 年前
        1
  •  5
  •   Havenard    10 年前

    首先 main() 应该是 int main(int argc, char **argv) 。您不能修改它。即使代码编译,系统也会调用 main() 调用它的方式,第一个参数是程序的参数数(如果没有给定参数,则为1)。无法保证它总是1。如果使用其他参数运行程序,则此数字将增加。

    第二,你的 printf() 正在尝试打印的返回值 main(++i) ,howover,你的 main() 干脆什么都不回。如果希望在这里看到一致性,则必须给函数一个返回值。

    最后,你不应该调用自己程序的入口点,更不用说使用递归了。

        2
  •  1
  •   R Sahu    10 年前

    以下是C标准草案(N1570)的内容 main :

    5.1.2.2.1程序启动

    1程序启动时调用的函数命名为 主要的 。实现声明没有 此函数的原型。它应定义为返回类型 int 并且没有 参数:

    int main(void) { /* ... */ }
    

    或具有两个参数(这里称为 argc argv ,尽管任何名称都可能是 使用,因为它们是声明它们的函数的本地函数):

    int main(int argc, char *argv[]) { /* ... */ }
    

    或等效的或以某种其他实施方式定义的方式。

    显然 主要的 程序中的函数既不是上述形式。除非您的平台支持您正在使用的表单,否则程序将显示未定义的行为。

        3
  •  1
  •   Community CDub    7 年前

    此程序具有 undefined behavior (UB),如果你的程序中有一个单独的实例未定义的行为,你不能安全地假设你的程序的任何输出或行为-它合法地可以发生任何事情(尽管在现实世界中,效果通常在代码中的UB位置附近有点本地化)。 旧的C90标准列出了100多个(如果我记得正确的话)UB的情况,并且顶部有未知数量的UB,这是标准没有描述的情况下的行为。对于每个C和C++标准,都存在一组UB情况。

    在您的情况下(没有咨询标准),UB的实例至少是:

    • 不返回用返回值声明的函数的值。(例外:第一次打电话给main-谢谢,Jim的评论)
    • 定义(和调用)main,而不是使用标准的预定义形式,或者由编译器指定(作为实现定义的行为)。

    由于您的程序中至少有一个UB实例,因此对结果的推测有点。。。推测性的,并且必须对编译器、操作系统、硬件,甚至并行运行的软件进行假设,这些假设通常是没有文档记录的或可以知道的。

        4
  •  0
  •   prashant khunt    10 年前

    您没有初始化i,因此默认值将取自存储在RAM中的地址。

    如果在重新启动计算机后多次运行该代码,则该代码将产生垃圾输出。

    输出也将取决于编译器。

        5
  •  0
  •   JakenVeina    10 年前

    我很惊讶竟然能编译。

    当操作系统实际运行程序并调用main()时,会向其传递两个32(或64)位值。您可以通过声明main(void)来忽略它们,也可以通过声明main(int argc,char**args)来使用它们。

    正如上面的原型所示,传递的第一个值是传递给进程的命令行参数数量的计数,第二个值是指向这些参数列表存储在内存中的位置的指针,可能是程序的本地堆栈上。

    argc的值始终至少为1,因为args中的第一个项字符串始终是由OS生成的程序本身的名称。

    关于你的意外输出,我想说一些东西没有被拉出来或推到堆栈上,所以变量被混淆了。这可能是因为main()的参数列表不完整,或者您声明main返回int,但没有返回任何内容。

        6
  •  -2
  •   Steve Works    10 年前

    我认为,主方法是在主方法内部调用自己。 为了增加变量的值,i++在其增加之前先打印i的值,而++i在打印i的之前先增加i的值。

    你可以用这个。。

    int x=0;
    main()
    {
       do
       {
       printf(x++);
       }while (i<10);
    
    }