回归;这句话的回报是什么?

时间:2013-11-15 16:41:35

标签: c function return printf undefined-behavior

考虑以下代码:

#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返回的值存储在累加器中... 这是否正确?

3 个答案:

答案 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