#include<stdio.h> main() int a=4; int f(int n) {int t=0 ; static int a=5 ; if(n%2) {int a=6 ; t+=a++

有以下程序

#include<stdio.h>
main()
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) ;} 程序运行后的输出结果是

//以后无论怎么样,代码必须写工整写,保证一行一句代码吧,要么不好看。
//给你简单解析下,如果你要答案的话,自己在编译器上运行下就行了。过程分析是必须的。
//这道题主要考察的作用域,题中一共有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.整体分析能力。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-06-09
程序本身就有错误。
主函数没有类型,定义函数时应该写上函数体,函数体应该用{}包含起来。int a=4;
int f(int n)就是一个错误,这应该是属于函数体内容或是全局变量或外部函数,应该写在主函数的上面或函数体之后。一个程序中有且只能有一个主函数。函数f()定义时,必须要对该函数进行声明,否则编译时,系统不知道你这个是什么。
同时系统不能分析到s是什么东西,因为没有定义。
这个程序很乱,你先整理一下,或这给题目我,我帮你写一个标准的C++程序。本回答被网友采纳
第2个回答  2012-09-20
记住“在作用域中生效的同名变量,谁声明离作用域最近,谁生效“就行了
第3个回答  2012-06-09
怎么又两个main() 函数 程序错误啊
第4个回答  2012-06-09
程序错误

#include<stdio.h> main() int a=4; int f(int n) {int t=0 ; stati...
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,因为其声明位置就在作用域内,离本作用域最...

#include <stdio.h> int f(int a); int main () { int f(int); int...
int main (){ int f(int);int a=5,i;for(i=0; i<3; i++)printf("%d ", f(a));return 0;} int f(int a){ auto int b=0;static int c=3;b = b+1;c = c+1;return (a+b+c);} 它运行之后的输出是:10 11 12 ...

#include<stdio.h> main() { int a=4; printf("%d\\n%d\\n%d\\n%d\\n...
a(3)入栈 a=a+1=4 a=a-1=3 a(3)入栈 a=a+1=4 a(4)入栈 然后按4,3,3,4的顺序出栈,就是输出,所以你看到的输出顺序是正的 就算是从左到右算的话也应该是5444,不是5344

C语言问题: #include <stdio.h> int main() { int a=3,
a+=b,代表给a赋值为(a+b),-=同理,同时这俩运算符平级。所以顺序为首先a+=a,此时a=2a;然后a-=a,此时=0;然后c=a=0

#include<stdio.h> #include<math.h> main() { int i
题意是某项的值小于1e-5,而不是它们总和小于这个值,和是不会小于这个值的,所以循环不会停,不会输出

#include<stdio.h> void main() { int f(int a, int
p=f(i,++i); 在执行这一步时i编程了3,所以传入函数f时a和b都等于3返回值为0 ++i时i的值就变了。改为p=f(i,i+1)就好了

int a=2; int f(int n) { static int a=3; int t=0; if(n%2){static...
首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。下面是main.c的内容 除了头文件,需要声明函数:void msg();int main(void){ extern char a; \/\/ extern variable must be declared before use printf("%c ", a);(void)msg();return 0;} ...

#include <stdio.h>
include <stdio.h> main(){ int a=5,b=4,c=3,d=2;if(a>b && b>c)printf("%d\\n",d);else if ((c-1>=d)==1)printf("%d\\n",d+1);else printf("%d\\n",d+2);return 0;}

#include<stdio.h> main() { int a[5],i ; int *p=a,t; for(i=0;i<...
第二个scanf中“leader name"前要加& 你的很多标点符号不对,一般要用英文符号,而且一句话结束后要用;,而不是:。注意。另外一般运行是有错误的话,下面会有提示,是哪里错了,检查一下。

#include<stdio.h> main() { int a=5,c; c=(a+=a++); printf("%d,%d\\...
关键在于这一语句的理解 c=(a+=a++);1、先看右边括号中的 a+=a++,对于它,再看等号右边,右边 a 先执行运算,再加1,所以先执行a+=a; 得到a=10,将a的值赋于c 2、再执行a++,10加1就得到了11

相似回答