为什么在c中返回类型的函数没有return语句?

时间:2011-05-10 16:14:16

标签: c

  

可能重复:
  Why can you return from a non-void function without returning a value without producing a compiler error?

void main()
{
    int y=0;
    clrscr();
    printf("%d\n",Testing());
    y=Testing();
    printf("%d",y);
    getch();
}
int  Testing()
{
    int x=100;
    //return x;
}

Result 
512
4

我没有从测试功能返回任何东西仍然值即将到来?

另一个问题也是

void main()
{
    char Testing();
    int y=0;
    clrscr();
    printf("%d\n",Testing());
    if(Testing())
        printf("if--exi");
    else
        printf("else--exi");
    getch();
}
char Testing()
{
    char y;
    //return y;
}

Result

0
if--exi

如果注释了printf,则结果为

else--exi

为什么会这样发生

6 个答案:

答案 0 :(得分:5)

声明为返回到达没有返回路径的值的函数具有未定义的行为。你不幸的是它似乎仍然会返回一个半合理的价值。编译器假定在函数的所有出口中调用return,并且返回值将在特定位置可用。

在你的第二个例子中,任何事情都会发生,包括每次调用都会返回不同的值。

g ++有一个警告来检测这个问题,它非常值得启用。

答案 1 :(得分:3)

为什么你的问题同时标记了C和C ++,而标题特指C?这两种语言在这方面有很大不同。

在C语言中,这些功能“起作用”,因为语言要求它们起作用。为什么不?使用某种返回类型声明的函数可能仍会执行一些有用的工作(除了返回任何内容)。因此,从正式的角度来看,在这样的函数中没有return语句是完全没问题的。然而,这不是一个好的编程实践。只要您不尝试使用返回的值(函数没有真正返回),该函数就会起作用。您正在尝试使用该值,这会使代码的行为不确定。你声称它“有效”。实际上它没有。在这种情况下会发生什么以及为什么 - 这些问题没有答案。出于所有方式和目的,您的代码行为基本上是随机且不可预测的。

在C ++语言中,“忘记”返回带有return语句的值的函数总是会立即导致未定义的行为,无论调用者是否使用该值。

答案 2 :(得分:2)

它只是内存中的随机垃圾你回来了,因此,第二个例子中的每个调用产生不同的结果

答案 3 :(得分:2)

获取函数的返回值是未定义的行为,该函数被声明为不返回任何内容。

未定义的行为意味着任何事情都是可能的,并且C ++标准没有定义操作的结果。您无法估算或估算任何程序运行中的结果。

答案 4 :(得分:1)

您正在导致未定义的行为,因此字面上任何输出都是可能的。

答案 5 :(得分:0)

从技术上讲,您正在调用“未定义的行为”。未定义的行为表现良好,没有定义。如果程序的行为未定义,则可能会打印512,499,甚至是葛底斯堡地址的完整文本。

我不会将你在任何合理意义上表现为“工作”的结果描述出来。

P.S。如果您使用的是GNU Compiler Collection,我建议至少使用 这些开关:“ - Wall -Werror”。

P.p.s。在过去的几年中,在ANSI标准C之前的日子里,某个非优化的Z-80 C编译器会接受这个程序片段:

int ReturnThree() {
  3;
}

并生成与用户指定的代码相同的代码:

int ReturnThree() {
  return 3;
}