检查函数的返回值而不返回return语句

时间:2011-07-10 03:19:46

标签: c return-value

使用下面的示例,请解释为什么有时不需要return语句?函数具有返回类型,但缺少return语句。同时,程序编译并正常工作。

请帮助我更好地理解

      5 
      6 char* handleInput() {
      8     fgets(buffer, 1024, stdin);
      9 **//    return buffer;**       <---- COMMENTED RETURN
     10 }
     11 
     12 void main() {
     14         char* ptr = handleInput();
     15         int flag = atoi(ptr);    
     16         if (flag < 0) break;    
     17         printf("You entered: %s\n", ptr);
     20 }

3 个答案:

答案 0 :(得分:10)

基本上归来的是愚蠢的运气。当它返回时,你会得到CPU寄存器中发生的事情。例如,如果返回的值在AX中,并且char*恰好在AX中,那么你很幸运。我相信这是一种不确定的行为;即C语言规范并没有告诉你应该这样做什么,所以它留给了编译器。我很惊讶现代编译器至少不会向你发出警告。

答案 1 :(得分:1)

C99 6.9.1 / 12“函数定义”说:

  

如果到达了终止函数的},并且调用者使用了函数调用的值,则行为是未定义的。

C90 6.6.6.4“return声明”标准说明了具有类似效果的内容:

  

如果执行了没有表达式的return语句,并且调用者使用了函数调用的值,则行为未定义。到达终止函数的}等同于没有表达式的return语句。

因此允许从函数返回而不从函数返回某些 - 但是函数的调用者不允许使用函数调用的“结果”。这是未定义的行为,并且像其他答案一样,你可以通过未定义的行为得到“预期的”结果,但这只是偶然的。

我认为这样做的理由是,如果函数没有显式声明(或者如果声明省略了返回类型),则预标准C默认为函数的返回类型int,并且继续在C标准化时得到支持。其中许多功能只是为了产生副作用而被调用,并且没有预期或提供的返回值。

一对旁注:

    如果使用-Wall选项,
  • gcc会发出警告。 MSVC默认警告它。
  • 您应该收到有关if (flag < 0) break;行的编译错误,因为break不在循环或切换中。
  • main()应该返回int而不是void-Wall也会发出警告)。当然,你也应该明确地返回一些值......

答案 2 :(得分:-1)

在声明为返回值的函数中不使用'return'是不好的做法,至少可以说。大多数编译器都应该生成警告。