什么main(++i)将在C中返回



我有一个这样的程序。

‪#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函数中的,它也会产生输出5111。提前谢谢。

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

其次,您的printf()正试图打印main(++i)的返回值,然而,您的main()根本不返回任何内容。如果你希望在这里看到任何一致性,你必须给你的函数一个返回值。

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

以下是C草案标准(N1570)对main:的说明

5.1.2.2.1程序启动

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

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

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

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

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

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

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

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

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

由于您的程序中至少有一个UB实例,因此对结果的猜测在某种程度上。。。推测性的,必须对编译器、操作系统、硬件,甚至并行运行的软件做出假设,这些假设通常没有文档记录或是已知的。

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

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

输出也将取决于编译器。

我甚至对编译感到惊讶。

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

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

argc的值总是至少为1,因为args中的第一个项字符串总是由操作系统生成的程序本身的名称。

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

我认为,main方法在main方法内部调用自己。要增加变量的值,i++在它增加之前打印i的值,而++i在打印i的数值之前先增加i的值。

你可以用这个。。

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

相关内容

  • 没有找到相关文章

最新更新