繁体   English   中英

为什么没有return语句的main函数返回值12?

[英]Why does a main function without a return statement return value 12?

我写了一个打印表格的程序。 我没有在main函数中包含返回语法,但每当我输入echo $时仍然如此? 它显示12。

我的源代码:

#include <stdio.h>


int main(void)
{
    int ans,i,n;
    printf("enter the no. : ");
    scanf("%d",&n);

    for(i=1;i<=10;i++)
    {
        ans = n*i;
        printf("%d * %d = %d\n",n,i,ans);
    }
}

我没有写回12,但每次执行程序时它仍返回12。

谢谢。

正如swegi所说,这是未定义的行为。 正如Steve Jessop等人所说,它是一个未指定的值,直到C89,并在C99中指定(观察到的行为不符合C99)

在大多数环境中实际发生的事情是,最后一个printf的返回值保留在用于返回值的寄存器中。

因此,对于n == 0,它将为11,如果n是一位数,则为12,对于两位数n为14,对于三位数n为16,等等。

回答是因为所有现有的答案都说它是未定义的行为,这是不正确的,所以我没有任何东西可以投票。

在C89中(感谢pmg参考标准草案 ),5.1.2.2.3:

从初始调用到main函数的返回等效于使用main函数返回的值作为其参数调用exit函数。 如果到达终止主函数的},则未指定返回到主机环境的终止状态。

在C99中,引用自n1256,5.1.2.2.3:

如果main函数的返回类型是与int兼容的类型,则从初始调用返回main函数等效于调用exit函数,其中main函数返回的值作为其参数; 到达终止main函数的}返回值0.如果返回类型与int不兼容,则返回到主机环境的终止状态未指定。

因此,它不是“未定义的行为”:它的行为就像main函数返回一样,但在C89中,返回的值不是由标准指定的。 对于您的示例程序,在您的实现中,返回的值似乎始终为12,可能是因为Ben Voigt说。 因为你使用的是Linux,所以将代码编译成C99可能不是一个很大的改变(或者无论如何,使用gcc几乎兼容的C99模式编译它)。

对于除main之外的任何返回值的函数,它未定义的行为, 除非调用者不使用返回值(n1256,6.9.1 / 12):

如果到达终止函数的},并且调用者使用函数调用的值,则行为是未定义的。

我不确定是否应该提及对main的初始调用被排除在此一般规则之外。 它不需要:从标准的POV,该调用没有调用者,所以我认为函数调用的值不是“调用者使用”,即使它成为终止状态对于该计划。

如果您完全熟悉汇编语言,您可能会记得函数的“返回值”是通过EAX寄存器传递的。

在这种情况下,正在从EAX读取返回值。 在这种情况下,恰好是12。

但是,您没有明确设置此值,它只是来自其余代码的工件(或者可能只是机会)。

如前所述,这绝对是undefined behavior 如果您只是好奇为什么会这样,请考虑这个解释。

但是,在任何情况下,都不要试图故意将这个值用作任何有意义的东西。

你的程序通过不应该返回任何东西而导致未定义的行为,因此调用者通常会抓住eax寄存器的值(在x86上,x64上的rax)在过程返回时,这通常是垃圾最后一次使用eax(通过函数返回值或只是基于寄存器的变量),在这种情况下,它可能是printf写入stdout缓冲区的char的数量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM