收到意外输出
Receiving unexpected output
这里当我 运行 下面的代码 :
#include<iostream>
using namespace std;
//static int x;
int& fun()
{
static int x = 10;
cout<<"in fun"<<endl;
return x;
}
int main()
{
fun() = 30;
cout << fun()<<endl;
return 0;
}
op:
in fun
in fun
30
上面的 fun() 第一次被调用两次是因为 fun() = 30;
第二次是因为 cout << fun()<<endl
语句。
如果为 cout << fun()<<endl
单独调用该函数,打印的值应该是 10
而不是 30
或者我遗漏了什么?
因为两者调用的函数不同
当我将 x 声明为全局静态时:
#include<iostream>
using namespace std;
static int x;
int& fun()
{
x = 10;
cout<<"in fun"<<" "<<x<<endl;
return x;
}
int main()
{
fun() = 30;
cout<<fun()<<endl;
return 0;
}
op:
in fun
in fun
10
我只想知道原因,为什么代码会这样?
为什么第一个案例会产生意外的 O/P?
当我将 auto x 用作:
int& fun()
{
int x = 10;
cout<<"in fun"<<endl;
return x;
}
它给出了分段错误。
请向我解释一下,我无法理解。
当静态变量是局部变量时,在第一次函数调用时将其初始化为 10。然后你在 main 中分配 30。第二次调用不修改静态对象,因为没有赋值;只有一次初始化。
你把函数中local static的初始化换成了x = 10;
,这是一个赋值操作。因此函数调用中的赋值将在main中的赋值之后。
您 return 对自动存储持续时间的本地对象的引用。该对象在函数 returns 后被销毁。在函数 returns 之后对该对象的任何访问都具有未定义的行为。
fun() = 30;
调用 fun()
将 x
初始化为 10
。对 x
的引用得到 returned,它将 x
设置为 30
.
cout << fun()<<endl;
调用 fun()
,x
未重新初始化,x
的值 30
被 returned。
int& fun()
{
int x = 10;
cout<<"in fun"<<endl;
return x;
}
这里你 return 对局部变量的引用在 fun()
结束时超出范围,在 main 中访问该引用是 UB。
情况 1:您要返回 x 的引用,因此 fun() = 30 会更改 x 的值。
情况 2:第二次调用 fun 将 x 的值恢复为 10。
情况 3:x 的范围仅限于函数。它不应该在函数之外使用。
这里当我 运行 下面的代码 :
#include<iostream>
using namespace std;
//static int x;
int& fun()
{
static int x = 10;
cout<<"in fun"<<endl;
return x;
}
int main()
{
fun() = 30;
cout << fun()<<endl;
return 0;
}
op:
in fun
in fun
30
上面的 fun() 第一次被调用两次是因为 fun() = 30;
第二次是因为 cout << fun()<<endl
语句。
如果为 cout << fun()<<endl
单独调用该函数,打印的值应该是 10
而不是 30
或者我遗漏了什么?
因为两者调用的函数不同
当我将 x 声明为全局静态时:
#include<iostream>
using namespace std;
static int x;
int& fun()
{
x = 10;
cout<<"in fun"<<" "<<x<<endl;
return x;
}
int main()
{
fun() = 30;
cout<<fun()<<endl;
return 0;
}
op:
in fun
in fun
10
我只想知道原因,为什么代码会这样? 为什么第一个案例会产生意外的 O/P?
当我将 auto x 用作:
int& fun()
{
int x = 10;
cout<<"in fun"<<endl;
return x;
}
它给出了分段错误。 请向我解释一下,我无法理解。
当静态变量是局部变量时,在第一次函数调用时将其初始化为 10。然后你在 main 中分配 30。第二次调用不修改静态对象,因为没有赋值;只有一次初始化。
你把函数中local static的初始化换成了
x = 10;
,这是一个赋值操作。因此函数调用中的赋值将在main中的赋值之后。您 return 对自动存储持续时间的本地对象的引用。该对象在函数 returns 后被销毁。在函数 returns 之后对该对象的任何访问都具有未定义的行为。
fun() = 30;
调用 fun()
将 x
初始化为 10
。对 x
的引用得到 returned,它将 x
设置为 30
.
cout << fun()<<endl;
调用 fun()
,x
未重新初始化,x
的值 30
被 returned。
int& fun()
{
int x = 10;
cout<<"in fun"<<endl;
return x;
}
这里你 return 对局部变量的引用在 fun()
结束时超出范围,在 main 中访问该引用是 UB。
情况 1:您要返回 x 的引用,因此 fun() = 30 会更改 x 的值。 情况 2:第二次调用 fun 将 x 的值恢复为 10。 情况 3:x 的范围仅限于函数。它不应该在函数之外使用。