2013-11-15 60 views
2

考虑下面的代码:return;这个声明返回什么?

#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

你的解释是错误的。在C中没有“累加器”,标准也不允许空的“返回”返回任何有用的东西。编译错误将显示它是无效的代码,并且您得到的效果是未定义行为。 – usr2564301

+1

@Jongware:用“Intel 32位”上的''eax'替换为“累加器”,并添加关于未定义行为的警告,对于OP所使用的编译器来说,解释是非常正确的。 – RichieHindle

+0

@RichieHindle:既不是'eax'也不是'Intel'是C标准的一部分(*它们中的任何*,因为有一对夫妇)。 – usr2564301

回答

0

它什么也没有返回。它只会终止你的功能。但是由于你的函数在C89中没有返回类型,它的返回类型隐含地转换为int,但它在C99和后者中不合法,并且这将调用未定义的行为

如果非void函数达到其主体的端部 - 即,它失败时执行return statement-- 程序的行为是未定义的,如果它试图使用该函数的返回值

一些编译器会发出警告:

control reaches end of non-void function 
3

行为是不确定的。

你所看到的4的原因是,你的代码发生不写,打印在message--%dprintf之间使用(在32位英特尔eax如。)返回从函数值寄存器(它印四个字符--25)和main中的最终printf

1

你正在调用undefined behavior通过返回值返回函数没有任何回报。如果我们看一下draft C99 standard部分6.8.6.4return语句说:

[...]不带表达式的return语句只能出现在一个函数 其返回类型为void。

你真的应该对这个应该怎么运行没有预期,但你可以做一些很好的猜测,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隐式返回类型。

+0

感谢您获得Deep C幻灯片的链接 - 非常有趣! – RichieHindle