【问题标题】:return ; what does this statement returns?返回 ;这个语句返回什么?
【发布时间】:2013-11-29 03:25:08
【问题描述】:

考虑以下代码:

#include <stdio.h>

int main( )  
{ 
  int  a ;
  a = message( ) ; 
  printf("--%d",a);
}

message( )  
{ 
  printf("--%d",printf ( "\nViruses are written in C" ));
  return ;
}

我得到的输出是:(在 GCC 中)

病毒是用c--25--4编写的

我的解释:return ;语句返回累加器中的值,最新的printf返回的值存储在累加器中... 这对不对?

【问题讨论】:

  • 你的解释是错误的。 C 中没有“累加器”,标准也不允许空的return 返回有用的anything。编译错误会显示它是无效的代码,你得到的效果是未定义的行为。
  • @Jongware:将“eax on Intel 32-bit”替换为“Accumulator”并添加有关未定义行为的警告,对于 OP 正在使用的编译器,该解释非常正确。跨度>
  • @RichieHindle:eax 和“英特尔”都不是 C 标准的一部分(任何,因为有几个)。
  • @Jongware:当然不是。因此“添加关于未定义行为的警告”和“对于 OP 正在使用的编译器”。仅仅因为某些东西不在规范中,并且不应该被依赖,并不意味着它不能被解释。
  • @RichieHindle 我在我的答案中添加了Deep C 幻灯片,这有助于从教育的角度理解这些事情。

标签: c function return printf undefined-behavior


【解决方案1】:

它什么也不返回。它只会终止您的功能。但由于您的函数在 C89 中没有返回类型,因此其返回类型隐式转换为 int,但在 C99 及更高版本中是不合法的,这将调用 未定义行为

如果一个非void函数到达它的主体的末尾——也就是说,它不能执行一个return语句——如果程序试图使用返回的值,那么它的行为是不确定的通过函数

有些编译器会发出警告:

control reaches end of non-void function

【讨论】:

    【解决方案2】:

    行为未定义。

    您看到 4 的原因是您的代码碰巧没有覆盖用于从函数返回值的寄存器(例如,在 32 位 Intel 上的 eax)在打印 @987654324 的 printf 之间@ in message(打印四个字符--25)和最后一个printf in main

    【讨论】:

      【解决方案3】:

      您正在调用undefined behavior,但没有从值返回函数返回任何内容。如果我们查看draft C99 standard 部分6.8.6.4 return 语句 说:

      [...] 没有表达式的 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 隐式返回类型。

      【讨论】:

      • 感谢 Deep C 幻灯片的链接 - 非常有趣!
      猜你喜欢
      • 2015-12-03
      • 1970-01-01
      • 2017-08-25
      • 2014-10-31
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 2014-02-15
      相关资源
      最近更新 更多