我在我的程序中遇到了这个问题。所以让我通过一个例子解释一下:
#include<iostream>
int func(){
if(1==0) return 100;
}
int main(){
int x=99;
x= func();
std::cout<<"Value of x: " << x <<std::endl;
}
我原以为输出为99
但输出为0
,那么这里发生了什么?
答案 0 :(得分:4)
导致未定义的行为。条件为false,因此函数没有返回值。
答案 1 :(得分:3)
您有未定义的行为,因为您的函数被声明为返回int
,但通过该函数的执行路径永远不会达到return
语句。
在C ++中,退出定义为返回非void
类型的函数是非法的,而不是通过带有参数的return语句。
ISO / IEC 14882:2003 6.6.3 [stmt.return] / 2:
[...]离开函数末尾相当于没有值的返回;这会导致值返回函数中的未定义行为。
答案 2 :(得分:2)
From C ++ 03 6.6.3 / 2“return statement”:
离开函数末尾相当于没有值的返回;这会导致值返回函数中的未定义行为。
由于你的功能“流出结束”,它是UB而你什么都不能(或任何东西)。
作为旁注:这与C中略有不同,在C中,声称返回某个函数的函数的末尾流出而不是 UB本身 - 只有在调用者时才会变为UB 使用执行该操作的函数的结果。
换句话说,使用您的示例,在C ++中,当func()
返回时,您有UB,无论该结果是否已分配给x
。在C中它只是UB,因为您将结果分配给x
。
答案 3 :(得分:1)
这取决于您使用的编译器。
编译此代码时,普通编译器将发出类似于:
的警告警告C4715:'func':并非所有控制路径都返回值
看起来你的编译器正在放置一个语句,当它在出路时没有找到0
语句时返回return
。因此,x
将被分配0
。
答案 4 :(得分:0)
正如其他人所说,你有不确定的行为。至于如何修复/识别它,一种方法是在编译程序时使用警告标志。如果您在键盘中运行代码,很容易看到问题:
cc1plus: warnings being treated as errors
In function 'int func()':
Line 5: warning: control reaches end of non-void function
在func()
中,if循环永远不会为true,但是您没有指定任何其他返回值,因此您有未定义的行为。在return 0;
之后添加if..
将解决问题。
答案 5 :(得分:0)
所以你期望99,最安全的赌注是通过引用传递x:
#include<iostream>
void func(int& a){
if (1==0)
a = 100;
}
int main(){
int x(99);
func(x);
std::cout << "Value of x: " << x << std::endl;
}