C语言的一道程序题!!!看不懂为什么!!求解释详细,谢谢!!

32. 以下程序的输出为(C )。
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

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-29
这个主要涉及到变量作用域的问题,两个原则
局部变量与全局变量重名时,屏蔽全局变量
{}里声明的局部变量的作用域就是{}的范围。本质上跟函数的{}是一个道理

{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本回答被网友采纳
第2个回答  2012-09-29
首先你定义了一个全局变量int a=2;
然后函数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的区别和使用。
第3个回答  2012-09-29
主要还是定义的变量作用域的问题。
还有一个容易忽略的问题,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.
第4个回答  2012-09-29
这是一道函数调用题,void main()为主函数。程序先执行主函数,所以到第一个 s+=f(&a);又因为它是调用的,要看到这里 int f(int *a)
{
return(*a)++;
}
实参把a=5;赋给形参,由于是return(*a)++;所以s=5;
到第二个 s+=f(&a);
而第一个 int a=2; 是全局变量
所以s=7;
第一个 int a=2; 经过 return(*a)++;后也变成3了
相似回答