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