2010-08-25 96 views
2

我在C++下面的代码:
C++返回值

int fff (int a , int b) 
{ 
    if (a>b) 
     return 0; 
    else a+b ; 
} 

虽然没写“回归”后,别的不作出错误!在主< BR /> 时写():

cout<<fff(1,2); 

它印1? 那是怎么发生的
可以解释一下吗?

+0

我不相信你! – Alex 2010-08-25 05:16:00

+2

不幸的是,并不是所有的控制路径返回值都不是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

+0

你可能得到了一个警告类似于'不是所有的控制路径都返回一个值'或者类似的东西... – liaK 2010-08-25 05:17:52

回答

5

这就是所谓的未定义的行为。任何事情都可能发生。

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,您应该避免掉头。

如果你这样做,你可能会得到一个随机值,否则你可能会崩溃。

0

“随机”返回vaule被调用后的CPU寄存器的值决定,因为寄存器是1通话后,所以价值1

如果你改变你的代码,该函数将返回不同的价值。

0

如果出现这样的错误,一个好的编译器(例如gcc)会发出警告,并且如果遇到任何警告,命令行开关将返回非零错误状态。这是未定义的行为:您看到的结果是编译器通常期望函数返回int以使用的位置发生的任何值:例如,累加器寄存器或堆栈上的某个点。您的代码不会将a + b复制到该位置,因此将会看到最后放置的位置。尽管如此,你甚至不能保证得到结果 - 如果函数没有返回语句,某些编译器/体系结构可能会使机器崩溃:例如 - pop()假设在堆栈中的值该返回已经推送了一个 - 堆栈的未来使用(包括读取函数返回地址)可以从高于或低于预期值的存储器地址获得结果。

2

$ 6.6.3/2-“流动断 函数的末尾相当于没有值返回 ;这导致 未定义的行为在 返回值的函数”

编译器可能会或可能不会诊断出这样的情况。

这里

其他A + B;

被视为没有任何副作用的表达式。