我在某个网站上发现这个代码,它没有返回值的返回语句。 但是在网站中它被写入,因为它给出了编译时错误。 当我试图编译程序时,知道在编译器中会出现什么错误。 该程序编译成功,没有给出任何错误..
c ++代码是:
int multiply(int x, int y)
{
int product = x * y;
}
int main()
{
cout << multiply(4, 5) << endl;
return 0;
}
输出:20
现在我很困惑,没有任何return语句如何编译成功。
答案 0 :(得分:2)
在函数中没有return
语句,此代码调用了undefined behavior。非void
函数必须具有return语句。
3 ...从函数末尾流出相当于没有值的返回;这会在值返回函数中导致未定义的行为。
正如评论中所述的WhozCraig一样,对于需要return
的非空返回值,有一个标准定义的例外:int main()
如果控件到达main的末尾而没有遇到return语句,那么效果就是执行
return 0;
如果是UB,您可能会得到预期或意外的结果 打印值可以是存储在堆栈中的值。
答案 1 :(得分:1)
如果返回非void的函数不返回任何内容,则它是未定义的行为。编译器应该至少给你一个警告。
可能发生的是,函数退出后product
的值仍在堆栈中,std::cout
打印该值。但同样,不要依赖未定义的行为。
答案 2 :(得分:1)
它未定义的行为,因此无法保证它能够正常工作。
当它正常工作时,它是因为结果恰好在用于从函数返回整数值的同一CPU寄存器中计算。这取决于许多因素(例如编译器版本,系统ABI,编译器选项,周围代码),因此您无法依赖它。