C语言的一道程序题!!!看不懂为什么!!求解释详细,谢谢!! 5
int
a=2;
int f(int *a)
{
return(*a)++;
}
void main()
{
int s=0;
{int a=5;
s+=f(&a);
}
s+=f(&a);
printf("%d %d\n",a,s);
}
A:2 7
B:2 10
C:3 7
D:3 11 展开
#include <stdio.h>
#include <stdlib.h>
int a = 2;
int f(int *a)
{
return(*a)++; //(*a)++,是先返回*a地址内的值,然后这个函数执行以后把(*a)内值加1.
}
void main()
{
int s=0; //在c文件中是局部变量在main中最外围的{}中起作用
{
int a=5; //局部变量,a=5.它就在{}内起作用。建议写程序不要写成与全局变量同名。
s+=f(&a); //在这个{}内,s = s + f(&a)= 0 + 5 = 5
//然后(*a)内值再加1,此时在这个{}内a 变成了 6
}
s=s+f(&a); //此时s = 5,整个文件内全局变量int a = 2 ,在上一个{}内局部变量不起作用了。
//s = s + f(&a) = 5 + 2 = 7
//此时(*a)内值加1 ,a = 2 + 1 = 3
printf("a = %d, s =%d\n",a,s);//所以输出结果a = 3 ,s = 7
}
以下是codeblock内运行结果
a=3 s=7
局部变量与全局变量重名时,屏蔽全局变量
{}里声明的局部变量的作用域就是{}的范围。本质上跟函数的{}是一个道理
{int a=5;
s+=f(&a);
}代码中,会屏蔽掉外面的全局变量a,此时函数f的参数是5,所以计算后s 为5。
之后的s+=f(&a);中,a是全局变量a(因为int a=5的作用范围是那个{}),所以s为7
在printf中的a是全局变量的a,因为经过上面f函数的计算,所以a为3
然后函数f(int *a)目的是把你传递过来的实参数加1.注意:return (*a)++;这句是先执行返回,先把指针a指向的值返回,然后再把该指向的对象进行加1操作。
主函数里面是这样运行的,
定义了一个s,后面有个括号,里面又定义了个局部变量a,初始化为5;然后你调用函数f,运行完以后,s的值变成5,而临时变量a的值变成了6,继续运行,临时变量的a被释放了。后面又调用了函数f,但是这个变量a是你定义的全局变量,值为2,调用完以后,s的值就变成了7,而a的值加1变成了3.所以最后输出值为:3 7.
明白了吗?
注意两点:1是函数f返回值那,是先返回后,再把指向的对象加1,
2、就是主函数里面的局部变量a,和全局变量a的区别和使用。
还有一个容易忽略的问题,return (*a)++;这句话的意思是 先返回*a,然后*a++,即最后*a增一。不是直接返回(*a)++。
进入main函数,定义变量S=0;
下面这里有个{ },相当于一个作用域,也就是{ }里定义的变量只在这里面有效,出了{ },针对的就是外一个作用域。由于在{ }定义变量a=5,是局部变量,所以s+=f(&a),s=0+5=5,同时{ }内的a加以1,a=6;然后出了{ },作用域消失,{ }内定义的a,销毁。
然后s+=f(&a),此时的a就是全局变量的a=2,所以s+=f(&a),s=5+2=7,同时a+1=3;
最后输出,a=3,s=7.
2012-09-29
{
return(*a)++;
}
实参把a=5;赋给形参,由于是return(*a)++;所以s=5;
到第二个 s+=f(&a);
而第一个 int a=2; 是全局变量
所以s=7;
第一个 int a=2; 经过 return(*a)++;后也变成3了