//以后无论怎么样,代码必须写工整写,保证一行一句代码吧,要么不好看。
//给你简单解析下,如果你要答案的话,自己在编译器上运行下就行了。过程分析是必须的。
//这道题主要考察的作用域,题中一共有3种a变量,分别是全局变量(int a = 4),静态变量(static int a = 5),局部变量(int a = 6 和 int a = 7), 这3个变量在不同作用域生效,基本原则就一条,"在作用域中生效的同名变量,谁声明离作用域最近,谁生效",(什么是作用域?在c里面,作用域可以简单的理解成匹配"{" "}"之间的范围)
// 全局变量作用域,整个程序中.作用域最大,
// 静态变量&局部变量作用域,只在{}之内有效。
int a=4; //全局变量
int f(int n)
{
int t=0 ;
static int a=5; //静态变量,其作用域在int f(int n)内均有效
if(n%2)
{
int a=6; //局部变量,只在这对括号内有效
t+=a++; //?这个a是哪个? 就是局部变量int a = 6,因为其声明位置就在作用域内,离本作用域最近
}
else
{
int a=7;
t+=a++; //?a 是哪个?从上面分析你猜猜? 就是 int a = 7.
}
return t+a++; //?这个a 是static int a ,因为上面那2个局部变量的a已经失效了。 而在这个作用域内,static int a 就是在作用域生成的,所以这个a 是静态哪个
}
int main()
{
int s = a,i = 0; //这个a 是哪个? 是全局变量 int a = 4;
for( ;i<2 ;i++)
s+=f(i) ; // 4 + 7 + 7
printf ("%d\n",s) ;
}
//开始分析main 函数了
第一步:int s = a,i = 0; // s = 4, i = 0
第二部 for(;i<2;i++) s+=f(i);
//i = 0 ,所以 s += f(0); 进入f()函数,因为0%2== 0,所以执行 else{int a=7 ;t+=a++;}里面的内容. 有即t+=7++; 这里执行完 t = 7,而局部变量a = 8;具体自己看。 然后 返回t + a++; 这里a 是静态哪个, t+=5++; 返回函数前 t = 7 + 5, static a = 6;
所以执行完这一步 s = 4 + 12 = 16;
第三步: 此时i = 1,s = 16了。 s+f(1) , 进入f()函数,1%2== 1,所以执行if(){}里面的语句。有 t = 0 + 6 = 6; 然后执行return t+a++,这个a 是static 的,上面已经分析这个a的值是6了,所以有 t = 6 + 6 = 12;
所以返回时有 s = 16 + 12 = 28.
打印出s = 28;
思路如果不清晰,自己好好运行一下程序,明白下。
本题重点: 1.同名变量在作用域中的优先级
2.静态变量的性质
3.t += a++; 运行结束t 和 a的值是什么. 即使考察 a++ 的性质.
5.整体分析能力。
程序本身就有错误。
主函数没有类型,定义函数时应该写上函数体,函数体应该用{}包含起来。int a=4;
int f(int n)就是一个错误,这应该是属于函数体内容或是全局变量或外部函数,应该写在主函数的上面或函数体之后。一个程序中有且只能有一个主函数。函数f()定义时,必须要对该函数进行声明,否则编译时,系统不知道你这个是什么。
同时系统不能分析到s是什么东西,因为没有定义。
这个程序很乱,你先整理一下,或这给题目我,我帮你写一个标准的C++程序。
记住“在作用域中生效的同名变量,谁声明离作用域最近,谁生效“就行了
怎么又两个main() 函数 程序错误啊
程序错误