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,等等.
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,该调用没有调用者,所以我认为函数调用的值不是"调用者使用",即使它成为终止状态对于该计划.