我在C++下面的代码:
C++返回值
int fff (int a , int b)
{
if (a>b)
return 0;
else a+b ;
}
虽然没写“回归”后,别的不作出错误!在主< BR /> 时写():
cout<<fff(1,2);
它印1? 那是怎么发生的
可以解释一下吗?
我在C++下面的代码:
C++返回值
int fff (int a , int b)
{
if (a>b)
return 0;
else a+b ;
}
虽然没写“回归”后,别的不作出错误!在主< BR /> 时写():
cout<<fff(1,2);
它印1? 那是怎么发生的
可以解释一下吗?
这就是所谓的未定义的行为。任何事情都可能发生。
C++不要求你总是在函数的最后返回一个值,因为它可以编写代码,永远不会有:
int fff (int a , int b)
{
if (a>b)
return 0;
else return a+b;
// still no return at end of function
// syntactically, just as bad as original example
// semantically, nothing bad can happen
}
然而,编译器不能确定,如果你从来没有到该功能的结束,并且它可以做的最多就是发出警告。没有return
,您应该避免掉头。
如果你这样做,你可能会得到一个随机值,否则你可能会崩溃。
“随机”返回vaule被调用后的CPU寄存器的值决定,因为寄存器是1通话后,所以价值1
如果你改变你的代码,该函数将返回不同的价值。
如果出现这样的错误,一个好的编译器(例如gcc)会发出警告,并且如果遇到任何警告,命令行开关将返回非零错误状态。这是未定义的行为:您看到的结果是编译器通常期望函数返回int以使用的位置发生的任何值:例如,累加器寄存器或堆栈上的某个点。您的代码不会将a + b复制到该位置,因此将会看到最后放置的位置。尽管如此,你甚至不能保证得到结果 - 如果函数没有返回语句,某些编译器/体系结构可能会使机器崩溃:例如 - pop()假设在堆栈中的值该返回已经推送了一个 - 堆栈的未来使用(包括读取函数返回地址)可以从高于或低于预期值的存储器地址获得结果。
$ 6.6.3/2-“流动断 函数的末尾相当于没有值返回 ;这导致 未定义的行为在 返回值的函数”
编译器可能会或可能不会诊断出这样的情况。
这里
其他A + B;
被视为没有任何副作用的表达式。
我不相信你! – Alex 2010-08-25 05:16:00
不幸的是,并不是所有的控制路径返回值都不是C++中的错误。看到这个解释http://stackoverflow.com/questions/1735038/why-not-all-control-paths-return-a-value-is-warning-and-not-an-error – Naveen 2010-08-25 05:16:44
你可能得到了一个警告类似于'不是所有的控制路径都返回一个值'或者类似的东西... – liaK 2010-08-25 05:17:52