当我运行这个程序时:
#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;
}
我得到了以下输出:
Square of (5) is: 2280716
After pass, (a) is: 25
什么是2280716
?而且,如果函数sqr(a)
中没有return
语句,如何将值返回到int sqr(int &x)
?
感谢。
答案 0 :(得分:30)
严格来说,这会导致未定义的行为。实际上,由于sqr
具有返回类型int
,因此即使没有return
语句,它也会返回一些内容。那个东西可以是任何int
值。
添加return
语句并在编译器中打开警告(例如g++ -Wall
)。
int sqr(int &x)
{
return x = x*x;
}
答案 1 :(得分:8)
这是一些垃圾,取决于一些因素。可能这是存储在内存中的值,如果函数有return
语句,函数会将结果放在内存中。该内存未经处理,然后由调用者读取。
不要想太多 - 只需添加一个return
声明。
答案 2 :(得分:4)
您的函数sqr()
没有返回语句。该函数具有与返回值有关的未定义行为。您的第一个输出显示此返回值。
编译器应该显示诊断。
试试这个:
int sqr(int x)
{
return x*x;
}
答案 3 :(得分:3)
您正在尝试打印sqr(int&amp; x)的返回值,在这种情况下这是垃圾值。但是没有返回正确的X * X. 尝试从sqe
返回有效的X * X.
int sqr(int &x) { x= x*x; return x;}
答案 4 :(得分:2)
如果函数未声明void
,那么必须有一个return语句,告诉返回调用者时应该是什么值。如果你没有这样做而只是函数结束而没有返回值,则调用此函数的结果是"Undefined Behavior",这意味着你的程序可以执行任何操作(包括崩溃或删除硬盘上的所有内容)。 / p>
通常情况下,如果该值只是一个简单的int,您将获得时髦的数字,但在更复杂的情况下,可能会成为一个大问题的根源。只是不要这样做。
编译器通常会通知您,如果得到适当的指示,您会忘记返回声明(即启用最大警告级别)。您可以省略仅在函数未实际返回的情况下返回值(即抛出异常或永远循环)。
此外,由于C ++语言的疯狂特殊规则,函数main
可以在没有return
语句的情况下结束,尽管被声明为返回int
。不要浪费你的时间寻找这个例外的合理原因,没有。
答案 5 :(得分:1)
您需要在以下选项之间做出选择:
1)通过引用/值传递并返回INT。
2)通过引用传递AND返回void。
此选择取决于您的功能目的。
如果你想要一个能给出数字平方的函数,可以使用第一个。如果你想要一个带变量的函数并用它的平方代替它,那么使用第二个。
所以:
int sqr(int& x)
{
return x*x;
}
OR
void sqr(int& x)
{
x= x*x;
}