有没有人可以详细说明此代码中的引用行为,为什么它在第一行而不是11行打印12。
以下是代码
#include <cstdio>
using namespace std;
int &fun()
{
static int x = 10;
x++;
return x;
}
int main()
{
int *ptr=&fun();
int *ptr1=&fun();
printf("%p %p \t %d %d",(void*)ptr,(void*)ptr1,*ptr,*ptr1);
return 0;
}
代码的输出是
134519132 134519132 12 12
请解释为什么 12 在第一次通话时打印 11 我明白第二次通话时应该打印12
答案 0 :(得分:4)
ptr
和ptr1
指向同一个变量static int x
。第二次调用将static int x
的值更改为12
,然后根据derefernce ptr
和ptr1
打印出该值,同样的结果将打印出来。
答案 1 :(得分:3)
fun()返回的int引用对于两个调用都是相同的(引用静态x),因此两个调用的引用地址相同。因此,相同地址的所得取消引用是当前相同的值。
答案 2 :(得分:2)
您的错误似乎是在printf()
打印*ptr
时尽快打印出来。它不是;在计算printf()
和ptr
之前,不会调用ptr1
。由于ptr
和ptr1
都指向相同的内存位置(这是一个静态变量),并且在第一次调用fun()
和之后该位置都会更新第二,地址保留了该值。
答案 3 :(得分:0)
static
个变量具有生命周期范围,并存储在静态分配的内存中。这意味着函数内的static
局部变量的存储不会在调用堆栈上分配和释放。
在编译时初始化x
后,x
的值将保存在函数fun
的调用之间。
当C ++语句按顺序执行时,printf
将在给定行中调用两个函数调用后执行
int *ptr=&fun();
int *ptr1=&fun();
因此x
的值在执行12
语句之前将为printf
。
请记住
int *ptr=&fun();
int *ptr1=&fun();
不等于
int& (*ptr)() = &fun;
int& (*ptr1)() = &fun;
第二个代码段ptr
和ptr1
都保存了函数fun
的地址。在这种情况下,您需要直接调用函数或使用这些指针作为
int a = ptr();
int b = ptr1();
此a
和b
的调用值之后
将为12
。