考虑以下代码:
#include <stdio.h>
int main( )
{
int a ;
a = message( ) ;
printf("--%d",a);
}
message( )
{
printf("--%d",printf ( "\nViruses are written in C" ));
return ;
}
我得到的输出为:(在海湾合作委员会中)
病毒用c - 25--4
写成
我的解释:return ;
语句返回累加器中的值,最新printf
返回的值存储在累加器中...
这是否正确?
答案 0 :(得分:3)
行为未定义。
您看到4
的原因是您的代码碰巧没有覆盖用于从函数返回值的寄存器(例如,32位Intel上的eax
){{1在printf
中打印--%d
(打印四个字符message
)和--25
中的最终printf
。
答案 1 :(得分:1)
您通过返回值返回函数来调用undefined behavior。如果我们查看draft C99 standard部分6.8.6.4
返回声明说:
[...]没有表达式的return语句只能出现在函数中 返回类型无效。
你应该对这应该如何运行没有任何期望,但你可以做出一些好的猜测,因为Deep C演示文稿在几个部分中进行了演示,但我绝不会在生产环境中做任何这样的事情。
如果您启用了警告,则应该看到多条信息性消息,例如gcc
提供以下警告:
warning: implicit declaration of function ‘message’ [-Wimplicit-function-declaration]
warning: return type defaults to ‘int’ [enabled by default]
warning: ‘return’ with no value, in function returning non-void [enabled by default]
自从C99以来,您也不再依赖隐式返回类型,但是gcc
之类的编译器即使在C99模式下也支持它们。因此,如果是这种情况,则message
将具有int
隐式返回类型。
答案 2 :(得分:0)
它什么都不返回。它只会终止你的功能。但是由于你的函数在C89中没有返回类型,它的返回类型隐式转换为int
,但它在C99和后者中是不合法的,这将调用未定义的行为。
如果非
void
函数到达其正文的末尾 - 也就是说,它无法执行return
语句 - 如果尝试,程序的行为是不确定的使用函数返回的值。
有些编译器会发出警告:
control reaches end of non-void function