fun(){static int a;return a++;}先返回a的值后,a再自增。函数都已经返回了,a自增操作还属于该函数么?

发布时间:2024-05-17 07:39 发布:上海旅游网

问题描述:

fun(){static int a;return a++;}先返回a的值后,a再自增。函数都已经返回了,a自增操作还属于该函数么?具体的先后顺序是怎样的?

问题解答:

具体过程是这样的:
先产生a的临时变量,然后把a的临时变量放入函数栈中放返回值的位置,这是函数并没有执行返回动作。然后再把a进行自增操作,接着函数返回。所以,“a的自增操作以至于该函数”。你可以查看已经编译生成的程序的反汇编代码,更深刻地体会这个动作的具体过程。不同的编译器,过程可能有微小的差别,但不会影响以上结论。

个人认为该语句属于函数,操作不属于。
先返回a,然后再对a子增。

在C语言里,static用来修饰局部变量和全局变量。如果是修饰局部变量,那么这个值在函数调用完之后并不马上清除,而是保存它的值,可以用来做计数器。如果是用来修饰全局变量,主要目的是为了让别的文件不能使用这个变量。碰到多个程序员共同完成一个项目,可能会碰到全局变量重名的情况就解决了。顺便提一下,如果这个变量可以被外部应用,那么使用extern修饰。编译器碰到extern,它就知道这个变量在其他地方定义,可以跨文件使用。

在C++和C#里面沿用了C中static的用法。如果static修饰成员变量,那么没次使用完之后都保存值。可以用来计算变量实例化次数。如果使用static实例化成员函数,那么可以直接使用类名来访问这个成员函数,当然也可以使用对象来访问。

以下是示范代码(C++):

#include <iostream.h>
/*
这个实例主要说明static成员变量的用法,静态的变量
它的值每次调用完之后不清除,常用着计数器
*/
class Point
{
public:
Point(int xx,int yy);
virtual ~Point();
Point(Point &p);
int GetX();
int GetY();
static void GetCountP();//静态函数成员,这样才能通过类名来访问
private:
int X,Y;
static int countP;
};

Point::Point(int xx,int yy)
{
X=xx;
Y=yy;
countP++;
}

Point::~Point()
{

}

Point::Point(Point &p)
{
X=p.X;
Y=p.Y;
countP++;
}

int Point::GetX()
{
return X;
}

int Point::GetY()
{
return Y;
}

void Point::GetCountP()
{
cout<<"Object id="<<countP<<endl;
}

int Point::countP=0;

void main()
{
Point::GetCountP();
Point A(4,5);
cout<<"Point A,"<<A.GetX()<<","<<A.GetY();
A.GetCountP();//当然也可以通过对象名来访问
Point B(A);
cout<<"Point B,"<<B.GetX()<<","<<B.GetY();
B.GetCountP();
}

热点新闻