没有return语句功能执行成功

时间:2014-06-06 04:51:55

标签: c++

我在某个网站上发现这个代码,它没有返回值的返回语句。 但是在网站中它被写入,因为它给出了编译时错误。 当我试图编译程序时,知道在编译器中会出现什么错误。 该程序编译成功,没有给出任何错误..

c ++代码是:

int multiply(int x, int y)
{
  int product = x * y;
}

int main()
{
  cout << multiply(4, 5) << endl;
  return 0;
}

输出:20

现在我很困惑,没有任何return语句如何编译成功。

3 个答案:

答案 0 :(得分:2)

在函数中没有return语句,此代码调用了undefined behavior。非void函数必须具有return语句。

C ++11§6.6.3返回语句:

  

3 ...从函数末尾流出相当于没有值的返回;这会在值返回函数中导致未定义的行为

正如评论中所述的WhozCraig一样,对于需要return的非空返回值,有一个标准定义的例外:int main()

C ++11§3.6.1p5[basic.start.main]

  

如果控件到达main的末尾而没有遇到return语句,那么效果就是执行return 0;

如果是UB,您可能会得到预期或意外的结果 打印值可以是存储在堆栈中的值。

答案 1 :(得分:1)

如果返回非void的函数不返回任何内容,则它是未定义的行为。编译器应该至少给你一个警告。

可能发生的是,函数退出后product的值仍在堆栈中,std::cout打印该值。但同样,不要依赖未定义的行为。

答案 2 :(得分:1)

它未定义的行为,因此无法保证它能够正常工作。

当它正常工作时,它是因为结果恰好在用于从函数返回整数值的同一CPU寄存器中计算。这取决于许多因素(例如编译器版本,系统ABI,编译器选项,周围代码),因此您无法依赖它。