输出的结果是“2 4”
详细分析:全局静态变量a是用来控制main()函数中for循环调用函数fun()的次数,全局静态变量a的初始值为3。程序顺序运行步骤,步骤一:因为for循环条件中的变量i的初始值为1,满足条件1<3,调用fun()函数,fun()函数中定义了局部静态变量a,因为局部静态变量与全局静态变量的变量名相同,所以这个局部静态变量a覆盖了全局静态变量a,也就是全局静态变量a在fun()的函数体中没有起到作用,而只有局部静态变量a有作用,又因为函数体中的局部静态变量a只是把它自己赋值给了自己,而不是用数值赋值,所以编译器自动给局部静态变量a初始化为0,接着一个输出语句cout,在输出a之前先进行a=a+2的操作,所以第一个输出变量的值为2;步骤二:调用完fun()又返回main函数的for循环,接着i=i+1操作,i变为2,满足条件2<3,继续调用fun()函数,又因为fun()函数中定义的变量a是静态变量,所以这次的a调用的是上次调用fun()函数时a被修改后的值,也就是2,接着进行cout语句,输出a之前,先进行a=a+2运算,第二个输出数值是4,调用完fun()函数返回main函数;步骤三:再进行for循环,此时i=i+1,i为3,不满足条件式i<3,所以跳出for循环,最后运行cout语句,输出跳到下一行
(注意:fun()函数体中用到的三个a与全局静态变量a是没有关系的,它覆盖了全局静态变量a在函数体中的作用,如果你把函数体中的三个变量a改名为b,它的输出结果是一样的,具体如下:
void fun( )
{
static int b=b;
cout<<(b+=2)<<' ';
}
如果函数体是这样的就会陷入死循环(因为这时函数中没有与全局静态变量a同名的变量,所以全局静态变量a起到了作用,也就是fun()函数的a也就是全局静态变量a,它的a+=2运算改变着for循环中调用fun()函数的次数,而且for循环的次数是越来越大,这样就程序一直在做for循环,根据我上面讲的你自己去理解下,希望你能明白):
void fun()
{
static int b=b;
cout<<(a+=2)<<' ';
}
这个主要考察的是全局变量和局部变量作用域的问题,当全局变量和局部变量名称相同时,再局部变量的作用域内,局部变量会覆盖全局变量。最后值是多少,还是自己算吧
楼主要想学的明白,就应该用单步调试!