C++ 赋值给非void函数(不返回任何内容)会改变值吗?

C++ 赋值给非void函数(不返回任何内容)会改变值吗?,c++,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; } #包括 int func(){ 如果(1==

我在我的程序中遇到了这个问题,这造成了一些问题。让我举个例子来解释:

#include<iostream>

int func(){
        if(1==0) return 100;
}

int main(){

        int x=99;
        x= func();
        std::cout<<"Value of x: " << x <<std::endl;
}
#包括
int func(){
如果(1==0)返回100;
}
int main(){
int x=99;
x=func();

std::cout它导致未定义的行为。该条件为false,因此函数没有返回值。

您有未定义的行为,因为您的函数被声明为返回一个
int
,但通过函数的执行路径从未到达
return
语句

<>在C++中,除了通过一个带有参数的返回语句,退出一个定义为返回非-> >空> /代码>的函数是非法的。 ISO/IEC 14882:2003 6.6.3[标准返回]/2:

从函数末尾流出的[…]相当于没有值的返回;这会导致值返回函数中出现未定义的行为

从C++03 6.6.3/2“返回语句”:

从函数的末尾流出相当于没有值的返回;这会导致值返回函数中出现未定义的行为

因为你的函数是“结束的”,所以它是UB,你什么都不能期待

作为旁注:这与C语言略有不同,C语言中,从声明返回某个内容的函数末尾流出的流本身不是UB——只有在调用方使用执行该操作的函数的结果时,它才会变成UB


换句话说,使用你的例子,在C++中,你现在有ub <代码>函数()

返回,无论结果是否分配给
x
。在C中,它是UB,因为您将结果分配给
x

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


func()
中,if循环从来都不是true,但您没有指定任何其他返回值,因此您有未定义的行为。在
if..
之后添加
返回0;
将解决此问题。

这取决于您使用的编译器

编译此代码时,普通编译器将导致类似于以下内容的警告:

警告C4715:“func”:并非所有控制路径都返回值


看起来您的编译器正在放置一个返回
0
的语句,但在执行过程中未找到
return
语句。因此,
x
将被分配
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;
}
#包括
无效函数(int&a){
如果(1==0)
a=100;
}
int main(){
int x(99);
func(x);

std::我会恨你的行为吗,谢谢你朋友:)
#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;
}