首页 文章

什么主要(i)将在C中返回

提问于
浏览
-9

我有这样的程序 .

‪#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 回答

  • 1

    我认为,主要方法是在main方法中调用自己 . 为了增加变量的值,i在增加之前打印i的值,而i在打印i的值之前首先增加i的值 .

    你可以用这个..

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

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

    如果在重新启动计算机后多次运行代码,此代码将生成垃圾输出 .

    输出还取决于编译器 .

  • 5

    首先, main() 的声明应该是 int main(int argc, char **argv) . 你无法修改它 . 即使您的代码编译,系统也会按照它应该被调用的方式调用 main() ,第一个参数是程序的参数数量(如果没有给出参数,则为1) . 无法保证它始终为1.如果使用其他参数运行程序,此数字将会增加 .

    其次,你的 printf() 正在尝试打印 main(++i) 的返回值,但是, main() 根本就不会返回任何内容 . 如果您希望在此处看到任何一致性,则必须为函数提供返回值 .

    最后,你不应该调用你自己的程序的入口点,更不用说用它递归了 . 为这些东西创建一个单独的函数 .

  • -2

    这个程序到处都有undefined behavior(UB),如果你的程序中有单个实例未定义的行为,你就不能安全地假设你的程序的任何输出或行为 - 它在法律上可以发生任何事情(尽管在现实世界中在代码中UB位置附近的效果通常有点局限 . 列出的旧C90标准超过100(如果我没记错)UB的情况,并且顶部有未知数量的UB,这是情况的行为,标准没有描述 . 对于每个C和C标准,存在一组UB存在的情况 .

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

    • 不返回使用返回值声明的函数的值 . (例外:第一次打电话给主 - 感谢吉姆的评论)

    • 定义(和调用)main除了使用标准的预定义形式,或者由编译器指定(作为实现定义的行为) .

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

  • 0

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

    5.1.2.2.1程序启动1程序启动时调用的函数名为main . 该实现声明此函数没有原型 . 它应该使用返回类型int并且没有参数来定义:int main(void){/ * ... * /}
    或者有两个参数(这里称为argc和argv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称):int main(int argc,char * argv []){/ * . .. * /}
    或等效或以某种其他实现定义的方式 .

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

  • 1

    我很惊讶甚至编译 .

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

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

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

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

相关问题