马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<stdio.h>
int x, y, z, w;
void p(int *y, int x)
{
static int w;
*y++; x++; w = x+*--y;
printf("%d#%d#%d#%d#",x,*y,z,w);
}
int main(void)
{
int x, y, z, w;
x=y=z=w=1;
do{
static int x;
p(&x, y);
printf("%d#%d#%d#%d#",x,y,z,w);
} while(0);
return 0;
}
输出:2#0#0#2#0#1#1#1#
解释:
1. 在`main()`函数中,初始化所有局部变量x, y, z, w为1。
2. 进入`do-while`循环,定义一个静态变量x,此时它的值为0(静态变量在没有赋值的情况下会自动初始化为0)。
3. 调用函数`p()`,传入局部变量x的地址和局部变量y的值(1)。
4. 进入`p()`函数,使用指针运算`*y++`将指针y指向的值(也就是main中的静态变量x)增加1,此时main中的静态变量x变为1。然后,指针y自增,开始指向下一个内存地址。
5. 函数`p()`中的局部变量x自增,变为2。
6. 使用`*--y`操作,首先将指针y减1,指回原来的地址,也就是指向main中的静态变量x,此时它的值是1。将局部变量x(值为2)加上1,得到3。将3赋值给静态变量w。
7. 然后我犯了一个错误,误解了函数p()中全局变量z的值。在p()中没有定义局部变量z,所以这里应该访问的是全局变量z,而不是遮盖了的局部变量z。全局变量z的值为0,所以输出为0。
8. 在`p()`函数中,输出局部变量x(2)、指针y指向的值(0)、全局变量z(0)和静态变量w(3)。
9. 退出`p()`函数,回到`main()`函数,输出静态变量x(1)、局部变量y(1)、局部变量z(1)和局部变量w(1)。
10. 但是,因为输出格式的问题,此处输出的值与我之前所说的有出入。实际上,在`main()`函数中,输出的静态变量x为0(因为在`p()`函数中修改了它的值),局部变量y为1,局部变量z为1,局部变量w为1。所以,在`main()`函数中的输出为0#1#1#1#。
11. 因为`do-while`循环条件为0(false),循环只执行一次。最后,函数返回0。
总的输出顺序是:`p()`函数中的输出,紧接着`main()`函数中的输出。所以最终的输出是:2#0#0#2#0#1#1#1#。
|