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

zar*_*rna 16 c linux unspecified-behavior

我写了一个打印表格的程序.我没有在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Ben*_*igt 20

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

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

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

  • 这实际上是未指明的行为. (5认同)
  • 术语"实现定义"要求每个实现记录行为.在这种情况下没有这样的要求. (4认同)

Ste*_*sop 19

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

在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模式编译它).

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

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

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

  • 实际的1990 ISO C标准(可能是1989 ANSI标准)表示"返回主机环境的终止状态未定义".显然,在草案和标准出版之间,这个词从"未指定"变为"未定义".顺便提一下,[该链接似乎已经死亡](http://www.vmunix.com/~gabor/c/draft.html). (2认同)