[英]Printf return value without return statement
在3个不同的系统上进行了尝试:CentOS,Ubuntu和Windows(MinGW); 所以我不认为这是异常现象(未定义的行为)
int hello(void)
{
(void)printf("HELLO WORLD\n");
}
int main(void)
{
printf("%d\n",hello());
return 0;
}
输出为:
你好,世界
12
即使使用不同的文本,它也会返回正确的值。 有什么解释吗?
是的,这是 未定义的行为 。
如果结束}
达到,没有return
,使用返回的值是UB。
在C11
,第§6.9.1章, 函数定义
如果到达终止函数的
}
,并且调用者使用了函数调用的值,则该行为未定义。
您不应真正尝试通过查看UB的结果来判断 UB。 毕竟,它是undefined 。
构建代码时,您可能会收到警告:
warning: no return statement in function returning non-void [-Wreturn-type]
在功能上
int hello(void)
{
(void)printf("HELLO WORLD\n");
}
因为没有return
声明。 这就是为什么您会得到未定义的行为
尽管每个人都指出整个业务都是不确定的行为,但只有一个人回答了实际问题。 但是,那里的问题更加错误,由于某种原因,没有人解决。
在3个不同的系统上进行了尝试:CentOS,Ubuntu和Windows(MinGW); 所以我不认为这是异常现象(未定义的行为)
这种推理存在严重缺陷(您所测试的系统数量无法告诉您是否已定义)。 不仅如此,您的测试显然是肤浅的。 在我的系统上,使用-O2编译代码突然使它打印为0,并且可能在您的系统上发生同样的事情。
它可能偶然起作用的原因是,在您的系统上,返回值保留在EAX中,返回到main()之后并没有被修改,并且编译器发出了将值从EAX移至另一个printf的第一个参数的代码。
如前所述,并显示了-O2失败,因此不能依靠它。
最后是一个更错误的句子:
即使使用不同的文本,它也会返回正确的值。 有什么解释吗?
什么?
让我们看一下有问题的函数:
int hello(void)
{
(void)printf("HELLO WORLD\n");
}
该函数没有return语句,因此无论得到什么结果都不是“正确的值”。 特别是,您没有要求语言返回printf返回的值。 碰巧的是,在您的测试中,您获得了printf返回的值,但这不是您要的,因此从任何意义上说,它都不是“正确的”。 严格来讲,人们可能想知道在这种情况下是否可以保证返回最后调用的函数的返回值,但是对此进行了解释并说明没有。
12恰好是第一个printf的返回值。 可能是printf("HELLO WORLD\\n");
将保留在EAX
寄存器上。
因此,当第二个printf期望返回值时,它是函数( EAX
)的最后一个返回值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.