赋值给非void函数(什么都不返回)可以改变值?

时间:2011-08-03 17:15:07

标签: c++

我在我的程序中遇到了这个问题。所以让我通过一个例子解释一下:

#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,那么这里发生了什么?

6 个答案:

答案 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)

正如其他人所说,你有不确定的行为。至于如何修复/识别它,一种方法是在编译程序时使用警告标志。如果您在键盘中运行代码,很容易看到问题:

http://codepad.org/MXDSniWw

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;
}