当没有回报时标准会说什么?

时间:2017-12-12 13:50:46

标签: c++

考虑以下代码:

#include <iostream>
using namespace std;

int testReturn()
{
     // no return
}

int main() 
{
    cout << "!!!Hello World!!!" << testReturn() << endl;
    return 0;
}

编译器发出警告:..\src\test.cpp:15:1: warning: no return statement in function returning non-void [-Wreturn-type]。 所以在我的编译器中,输出是1

!!!Hello World!!!1

没有将return语句指定为未指定的行为吗?还是总是不为零?我将非常感谢你的帮助。

2 个答案:

答案 0 :(得分:6)

(问题最初(错误)标记为C)。

程序的行为在C和C ++中都是未定义的。

具有隐式返回值的唯一int函数是main,在这种情况下隐含0;再次在C和C ++中。

答案 1 :(得分:0)

可能的解释是返回int的函数总是返回一些东西,它通常是寄存器的内容。可能会发生用于返回值的寄存器在您的情况下与从函数返回之前计算最后一个表达式相同(在x86目标上,当然是eax)。

至少对于x86,此函数的返回值应该在eax寄存器中。那里的任何东西都会被调用者视为返回值。

因为eax用作返回寄存器,所以它通常用作&#34; scratch&#34;由calee注册,因为它不需要保留。这意味着它很可能被用作任何局部变量。因为它们两者在最后是相等的,所以更有可能将正确的值保留在eax中。

来自新约中引用的&#39; 89标准:

离开函数末尾相当于没有表达式的返回。在任何一种情况下,返回值都是未定义的。

该标准通常表达预先存在的实现的实地行为