这个c程序运行后,var1 var2 var3值分别为多少?高分求助!

#include <stdio.h>
static int var1=0;
int var2=3;
int var3=6;

void f(int var2)
{
static int i=0;
int j=9;
int var1;
i++;
j--;
var1=5;
var2=6;
var3=8;
}

int main(){
int var2;
var2=5;
f(var2);
f(var1);
f(var3);
return 0;
}

麻烦解释一下!高分求谢!

  答案是否是 var1 = 0,var2 = 5, var3 = 8。
  试着解释一下:
  1、在int var2;这句之前,var1 = 0,var2 = 3, var3 = 6。这个很好理解,因为它们都是全局变量。
  2、在var2 = 5;之后,这时var1 = 0,var2 = 5, var3 = 6。因为这里的var2是全局变量,所以在main主函数里再申请的一个局部变量var2是会把全局变量var2覆盖了,也就是说,在main函数里面,只要你要取var2的值,就是刚刚定义的局部变量var2的值,且var2 = 5。
  3、在f(var2)之后,var2 还是 = 5。因为f(int var2)函数的参数是取数值,即是传递数值,所以这里是将var2数值(=5)传进去,出来后,var2的值不会变。即使是在f()函数里,var2的值随意改动,它也只是f()函数的局部变量var2(这里f(int var2)中的var2定义了局部变量var2)的值在变,而main的局部变量var2的值不变。所以在f(var2)之后,var2 还是 = 5。
  4、在f(var1)之后,var1 = 0。和2、有点像。在f()里面,传进去的值是main的var1 = 0 的值,在f()里面就变成var2 = 0;即使后面var2 = 6,它的值也不会传出来,所以不会影响改变main()中的var1 的值。虽然f()里又新定义了一个var1,所以它跟全局变量var1没有任何关系。
  5、在f(var3)之后,var3 = 8。这里虽然由main的var3=6传进去f(),f()里的var2 变成了= 6;但是f()里面var3 = 8;这里的var3在f()里没有定义,所以就是f()函数外面之前就已经定义的 var3 = 6这个全局变量,现在它 = 8了所以无论在那个函数里,它都是var3 = 8;其实3、中f(var2)之后,var8 就 = 8了。

有点乱,希望能帮到你····
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-11
var1=0
var2=5
var3=8
在程序return 0;前加一句
printf("var1=%d\nvar2=%d\nvar3=%d",var1,var2,var3);

解析:
f(var2);
这里由于在main函数中已有定义一个var2,故会采用main中定义的值,var2=5。运行f(var2);时传入的是一个实参,并没有传递main函数中的var2,所以在f(var2);中计算后的值对main中var2的值不会产生任何影响。

f(var1);
由于var1在程序开头定义的,所以var1的作用域应该是整个程序,即对f(int var)和main都有影响。
由初始值var1=0;在main中并没有对var1进行任何的赋值,所以 f(var1);与 f(0);等价。同时在f()中又重新定义了一个var1,也有语句对这个重新定义的var1重新赋值即,var1=5,则var1=5仅在f函数中有效,又因为开头的var1是静态变量,但在f函数中又重新定义了一个var1,所以在开头定义的var1的值仍然为0,即var1=0(在全局中)。

f(var3);
由于在main函数中没有定义var3,则采用开头定义的int var3=6;即f(6)。而在f函数中也没有定义过任何的var3,所以仍然采用开头定义时的值var3=6.,此时遇到另一句对var3赋值的语句,var3=8;所以在全局中var3=8。追问

我不明白的是var3也是传递数值,为什么他的值会被f改变呢

追答

var3是最好理解的,int var3的定义语句只在开头定义全局变量的时候使用过,在主函数中并未定义var3或重新赋值,所以var3的初始值为6。
由于var3是全局变量,同样的在F中也并未重新定义var3,只是对var3重新赋值,即var3=8,所以全局变量var3=8。

给几点实例提示:
A例:如果在函外部和内部都定义过同一变量名,优先采用函数内部的定义的变量。
int kk = 10;
f(int a){
a++;
}
main(){
int kk = 1;//注意,此句重新定义了kk,可以将这句的kk看做是一个新的变量,比如是aa等,与开头定义的KK是两个不同的变量,作用范围只在重新定义的函数中
kk = f(kk);
printf("%d",kk); //这里kk=2;
}

B例:范围(特别注意:当两个printf要输出同一变量名时,但又不在同一函数中极有可能会出错,所以建议一般是只使用一条printf语句,其余的注释)
int kk = 10;
f(int a){
a++;
printf("%d",kk); //这里kk=10;
}
main(){
int kk = 1;//作用范围只在重新定义的函数中,出了这个范围则采用的是开头定义的全局变量KK
kk = f(kk);
//printf("%d",kk); //这里kk=2;
}

C例:如果仅在函外部定义过同一变量名,则此值采用函数外部定义的变量。
int kk = 10;
f(int a){
a++;
printf("%d",kk); //这里kk=2;因其在主函数中重新赋值过
}
main(){
kk = 2;//注意,此句只是赋值并未重新定义kk只是将第一句的kk重新赋值为kk=2,若是主函数中并没有这一句,则结果kk=11.
kk = f(kk);
//printf("%d",kk); //这里kk=3
}

本回答被提问者采纳
第2个回答  2013-01-11
你这个程序好像没有输出语句。printf();