C语言求高手指点!!!

29.以下程序的输出结果是()
#include “stdio.h”
#include “string.h”
int a=4;
int f(int n)
{int t=0;static int a=5;
if(n%2){int a=6;t+=a++;}
else {int a=7;t+=a++;}
return t+a++;
}
main( )
{int s=a,i=0;
for (;i<2;i++) s+=f(i);
printf("%d\n",s);
}

A.24 B.28 C.32 D.36 答案为B,if(n%2){int a=6;t+=a++;}中a的值增加了1,在执行 return t+a++;时,a的值为6还是7?

第1个回答  2011-07-27
因为你是用的是一维指针, 这样只能改变指针所指向的内存的内容, 却不能改变指针本身, 比如:

void fun(int* p)
{
p = (int*)malloc(100);
}

调用的地方: int* p = NULL;
fun(p);
调用完后p还是NULL, 因为在函数fun()内部使用的是指针p的一份拷贝_p, _p的变化并不会影响p, 如果想改变p,使用双重指针, 比如:
因为你是用的是一维指针, 这样只能改变指针所指向的内存的内容, 却不能改变指针本身, 比如:

void fun(int** p)
{
*p = (int*)malloc(100);
}

调用的地方:
int* p = NULL;
fun(&p);

这样p就有空间了...
另外,虚机团上产品团购,超级便宜
第2个回答  2011-07-26
static int a=5,加static的意义是a 在程序运行时就会一真存在且只有一个a(你可以当a为全局变量),且该语句只运行一次,函数再次被调用时,并不会再次赋值a为5,static a不随着f()函数的释放而消失,会一真存在!
在执行 return t+a++;时,a的值为7! 当执行完return t+a++;后a为8!
第3个回答  2019-06-17
第一个是考验你的循环输入的题目,只要设置for循环,在for循环里面写输入语句就可以了。
第二个你把c中的字符逐个去除和s中的对比,有的删除。
第三个和第二个大体一样,只是多了个输出到文件的操作
第四个就是定义四个int变量,分别作为要求要统计的总和。
都是基本的题目,稍微想想就能做出来了
第4个回答  2011-07-26
if(n%2){int a=6;t+=a++;}else {int a=7;t+=a++;}
i=0时,static int a=5,执行else {int a=7;t+=a++;} 后,t=t+a=0+7=7,a=a+1=8;return t+a++中a是static int a=5,执行后,t=t+a=7+5=12,a=a+1=6;f(0)=12
i=1时,静态局部变量a不再赋初值,因a在上次函数执行后已有值a=6;执行if(n%2) {int a=6;t+=a++;}后,t=t+a=0+6=6,a=a+1=7;return t+a++中a=6,执行后,f(1)=t+a=6+6=12,a=a+1=7;
所以,s=4+f(0)+f(1)=4+12+12=28;追问

你好,对于i=0时,static int a=5,执行else {int a=7;t+=a++;} 后,t=t+a=0+7=7,a=a+1=8;return t+a++中a是static int a=5,执行后,t=t+a=7+5=12,a=a+1=6;f(0)=12
return t+a++中a是static int a=5,为什么a是static int a=5,而不是7或者8?
i =1时,return t+a++中a=6 ???执行return前,a不是已经增加了1 吗?
你是说在{int a=6;t+=a++;}和 {int a=7;t+=a++;} 执行完后a的值还是取static int a=5 中a的值?

追答

static声明的局部变量即静态局部变量
1.用static声明的局部变量属于静态储存类别,在静态存储区分配存储单元,在整个程序运行期间都布释放。
2.对静态局部变量是再编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
3.如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值类型变量)或空字符(对字符变量)。
4.虽然静态局部变量在函数调用结束后仍然存在,但其他函数时不能引用它的。
{int a=6;t+=a++;}和 {int a=7;t+=a++;} 中的a都属于auto变量(即自动变量),有效空间从定义开始,到本段程序结束,在这里到a++后面的}。
{int a=6;t+=a++;}执行完a=5,return t+a++;执行完,a=6
a= {int a=7;t+=a++;} 执行完,a继续为上次这个函数执行完时的6,return t+a++;后,a=7

本回答被提问者采纳
第5个回答  2011-08-02
a的值为6,执行完之后才是7
相似回答