C++返回值没有return语句

Sim*_*ity 13 c++ return-value

当我运行这个程序时:

#include <iostream>

int sqr(int&);

int main()
{
    int a=5;
    std::cout<<"Square of (5) is: "<< sqr(a) <<std::endl;
    std::cout<<"After pass, (a) is: "<< a <<std::endl;
    return 0;
}

int sqr(int &x)
{
    x= x*x;
}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

Square of (5) is: 2280716
After pass, (a) is: 25
Run Code Online (Sandbox Code Playgroud)

什么是2280716?而且,如果函数中sqr(a)没有return语句,我如何获得返回的值int sqr(int &x)

谢谢.

Fre*_*Foo 31

严格来说,这会导致未定义的行为.实际上,由于sqr具有返回类型int,即使没有return语句,它也总会返回一些内容.那东西可以是任何int价值.

添加return语句并在编译器中打开警告(g++ -Wall例如).

int sqr(int &x)
{
    return x = x*x;
}
Run Code Online (Sandbox Code Playgroud)

  • `-Wall`为+1.(现在,如果你添加`-Werror` ...不,我不能投票两次,该死的.:-)) (6认同)
  • 它有点简单,不返回函数,除了`void`之外的返回类型导致未定义的行为,而不仅仅是返回未定义的值.不同之处在于声明它将返回一个未定义的值意味着只需忽略该值,一切都会好的,但事实并非如此.该程序可能会崩溃,损坏堆栈...... (3认同)
  • @David只是澄清未定义的行为位,并确保我完全理解这个问题; 例如,如果我们的返回值是unique_ptr <T>,没有return语句,该函数将返回垃圾代替T*,然后调用者将其解释为有效的unique_ptr,即使你是要忽略它,假装unique_ptr的析构函数会在尝试删除它的指针时崩溃你的程序(希望如此). (3认同)

sha*_*oth 8

这是一些垃圾,取决于一些因素.可能这是存储在内存中的值,如果它有一个return语句,函数会将结果放在内存中.该内存未经处理,然后由调用者读取.

不要想太多 - 只需添加一个return声明.