几道c语言二级题,详细解答

1.#include<stdio.h>
int f(int t[],int n);
main()
{
int a[4]={1,2,3,4},s;
s=f(a,4);
printf("%d\n",s);
}
int f(int t[],int n)
{
if(n>0)
return t[n-1]+f(t,n-1);
else return 0;
}

2.#include<studio.h>
int fun()
{static int x=1;
x*=2; return x;
}
main()
{int I,s=1;
for (i=1;i<=2;i++) s=fun();
printf(”%d\n”,s);
}

3. #include<stdio.h>
#define N 8
void fun(int *x,int i)
{*x=*(x+i);}
main()
{ int a[N]={1,2,3,4,5,6,7,8},i;
fun(a,2);
for(i=0; i<N/2); i++)
{ printf("%d",a[i]);}
printf("\n");
}

(1)
这相当于一个递归调用,每次调用都把数组的最后一个值取出来和递归结果求和。
实际上就相当于把这个数组从后向前依次加了一遍,所以结果是4+3+2+1 = 10
最后显示的结果是10。

(2)
static静态变量虽然退出函数,但值仍然保留,下次进入函数之后使用的还是之前的值。
在main里相当于两次调用了fun(),第一次x从1自乘2,所以x=2,第二次x从2自乘2,就是4。
所以再回到main之后,最后打印出来的结果是4。

(3)
先看fun(a,2)做了什么,相当于把(a+2)指向的数值赋给a指向的空间。
a的地址其实就是a[0],a+2也就相当于a[2]。所以*a = *(a+2)和a[0] = a[2]是一个效果。
a[2]是3,a[0]之前是1,赋值之后也是3。
回到main之后,i从0循环到8/2也就是4,一共循环四次,相当于把数组a的前4个值打印出来。
所以显示结果是3234。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-24
1、答案:10
实际上就是递归求和:4 + 3 + 2 + 1

2、答案:4
由于static int x=1; //所以x只赋值一次
第一次 x *= 2; //x= 2;
第二次 x *= 2; //x= 4;

3、答案:
3
2
3
4

因为:fun(a,2); 导致*a=*(a+2); 也就是a[0] = a[2] = 3;
第2个回答  2011-03-24
“ return t[n-1]+f(t,n-1);“是不是写错了?你的程序应该是递归求数值。应该是“ return f[n-1]+f(t,n-1);”吧?
第3个回答  2011-03-24
1 运行结果
10
2运算结果
4
3运算结果
3 2 3 4追问

第一题和第3题能不能详细点?谢谢

相似回答