【问题标题】:What is the return value from a function without a return statement?没有 return 语句的函数的返回值是多少?
【发布时间】:2016-08-29 14:13:41
【问题描述】:
#include<stdio.h>
int sel=5,out=10;

int findout(){
    if(sel==5)
        return out*=2;
}

int main(){
    int ret1,ret2=-1;
    ret1=findout();
    printf("before %d %d %d",sel,out,ret1);
    sel=8;out=7;
    ret2=findout();
    printf("\nafter %d %d %d",sel,out,ret2);
}

输出:

5 20 20 之前

8 7 8 之后

编辑:我的编译器没有显示任何警告。在这里你可以看到它。 它在 Ubuntu 操作系统上的代码块 GNU GCC 编译器上

g++   -c Untitled1.cpp -o Untitled1.o
g++  -o Untitled1 Untitled1.o   
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))

在第二种情况下,当我没有返回任何值(sel=8out =7)时,ret2 的值怎么会是 8

【问题讨论】:

  • 注意你的编译器警告。
  • 你希望“no value”的值是什么做什么
  • 另外,避免使用全局变量:通常它们弊大于利(代码难以理解,意外更改,...)。
  • 那些是一些病态的编辑。从垃圾级别提升到彻头彻尾的教育。我会赞成编辑,但我不知道如何。
  • 你的代码还能编译吗?

标签: c return return-value function-call


【解决方案1】:

sel 不是5 时,您的函数findout() 不会通过return 语句。

那是非法的C;你的编译器应该警告你。

不要忽略编译器警告

【讨论】:

  • 历史记录:在有标准 C 之前,没有 void 类型,因此名义上返回 int 但不需要返回值的函数使用 return 和只要调用代码没有尝试使用“返回值”,就没有值或从函数的末尾掉线,就没有问题。当 C 被标准化时,现有的代码不能失效。然而,在 C 的所有变体中,有时返回值有时不返回值是一个非常糟糕的主意。
  • 我在 Ubuntu 操作系统上使用 GNU GCC 编译器。它不显示任何警告。此外,我在网上 Ide 上试过它给出了相同的结果。
  • @HimaniVirmani:您需要启用警告。尝试gcc -std=c99 -pedantic -Wall -Wextra source.c 以获得一组好的启用警告。
【解决方案2】:

如果函数没有显式返回值main()函数是异常),并且返回值被调用者使用,程序调用undefined behavior

引用C11,第 6.9.1 章

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

在您的情况下,当if 条件评估为假时,控制路径中没有return 语句返回一个值,并且您正在使用“预期" 返回值,导致 UB。

【讨论】:

    【解决方案3】:

    这是未定义的行为。对于您的编译器,结果是 8。但例如使用 Clang 编译后:

    clang-3.5 main.cpp
    main.cpp:6:1: warning: control may reach end of non-void function [-Wreturn-type]
    

    并且在运行时:

    ./a.out 
    Illegal instruction (core dumped)
    

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 2021-08-15
      • 2011-06-06
      • 2016-06-12
      • 1970-01-01
      • 2011-10-02
      相关资源
      最近更新 更多