1、国家二级 C语言机试(选择题)模拟试卷 70及答案与解析 一、选择题 1 若有代数式 , (其中 e仅代表自然对数的底数,不是变量 ),则以下能够正确表示该代数式的 c语言表达式是 ( )。 ( A) sqrt(fabs(pow(n, x)+exp(x) ( B) sqrt(fabs(pow(n, x)+pow(x, e) ( C) sqrt(abs(nx+ex) ( D) sqrt(fabs(pow(x, n)+exp(x) 2 以下叙述中错误的是 ( )。 ( A)可以给指针变量赋一个整数作为地址值 ( B)函数可以返回地址值 ( C)改变函数形参的值,不会改变对应实参的值 ( D)当在程
2、序的开头包含头文件 stdio h时,可以给指针变量赋 NULL 3 有以下程序: #include int a=4; int f(int n) int t=0; static int a=5; if(n 2)im a=6; t+=a+; else int a=7; t+=a+; return t+a+; main( ) i11t s=a, i=0; for(; i 2; i+) s+=f(i); printf(“ d n“, s); 程序运行后的输出结果是 ( )。 ( A) 36 ( B) 24 ( C) 32 ( D) 28 4 有以下程序: #include im f(int n) i
3、nt t=0, a=5; if(n 2)int a=6; t+=a+; else int a: 7; t+=a+; return t+a+; main( ) int s=0, i=0; for(; i 2; i+) s+= f(i); printf(“ d n“, s); 程序运行后的输出结果是 ( )。 ( A) 28 ( B) 24 ( C) 32 ( D) 36 5 若有以下程序: iinclude im a=2; int f(int m) static int n; n=0; n+; a+ return n+m+a: main( ) int k; for(k=0; k 4; k+)pr
4、intf(“ d, “, f(k); 则程序的输出结果是 ( )。 ( A) 4, 5, 6, 7, ( B) 4, 7, 10, 13, ( C) 4, 6, 8, 10, ( D) 3, 5, 7, 9, 6 若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是( )。 ( A)函数的形参和实参分别占用不同的存储单元 ( B)形参只是形式上的存在,不 占用具体存储单元 ( C)同名的实参和形参占同一存储单元 ( D)函数的实参和其对应的形参共占同一存储单元 7 以下叙述中错误的是 ( )。 ( A) C程序必须由一个或一个以上的函数组成 ( B)函数调用可以作为一个独立的语句
5、存在 ( C)若函数有返回值,必须通过 return语句返回 ( D)函数形参的值也可以传回给对应的实参 8 以下程序中函数 f的功能是:当 flag为 1时,进行由小到大排序;当 flag为 0时,进行由大到小排序。 #include void f(int b, int n, int flag) int i, j, t; for(i=0; ibj: bi void fun(int a, intb) int t; t=a; a: b; b=t; main( ) int c10=1, 2, 3, 4, 5, 6, 7, 8, 9, 0, i; for(i: 0; i 10; i+=2)fun(c
6、i, ci+1); for(i=0; i 10; i+)printf(“ d, “, ci); printf(“ n“); 程序的运行结果是 ( )。 ( A) 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, ( B) 2, 1, 4, 3, 6, 5, 8, 7, 0, 9, ( C) 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, ( D) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 14 有以下程序: #include double f(double x); main( ) double a=0; int i; for(i=0; i main( )
7、 int m=1, n: 2, *P=&m, *q= n, *r; r=p; p=q; q=r; printf(“ d, d, d, d n“, m, n, *p, *q); 程序运行后的输出结果是 ( )。 ( A) 2, 1, 1, 2 ( B) 1, 2, l, 2 ( C) 2, 1, 2, l ( D) 1, 2, 2, 1 16 有以下程序: include void f(int *q) int i=0; for( ; i 5; i+) (*q)+; main() int a5=1, 2, 3, 4, 5, i; f(a); for(i=0; i void fun(int*a, i
8、nt*b) int*c; c=a; a=b; b=13; main( ) int x=3, y=5, *p=dzx, *q=&y; fun(p, q); printf(“ d, d, “, *p, *q); fun(&x, &y); printf(“ d, d n“, *P, *q); 程序运行后的输出结果是 ( )。 ( A) 3, 5, 3, 5 ( B) 3, 5, 5, 3 ( C) 5, 3, 3, 5 ( D) 5, 3, 5, 3 18 有以下程序: #include void fun(int *a, int n) *fun函数的功能是将 a所指数组元素从大到小排序 * int
9、t, i, j; for(i=0; i n-1; i+) for(j=i+1; j n; j+) if(ai void sp(int *a) int b=2; *a:, *a*2; printf(* d, “, *a); a= b; *a=*a*2; printf(“ d, “, *a); main( ) int k=3; sp(&k); printf(“ d n“, k); 则程序的输出结果是 ( )。 ( A) 6, 12, 12 ( B) 6, 4, 3 ( C) 6, 4, 6 ( D) 9, 4, 9 20 若有以下程序: #include int *f(int *s, int *t
10、) int k; if(*s *t) k=*s; *s=*t; *t=k; return s; main( ) int i=3, j=5, *P=&i, *q=&j, *r; r=f(p, q); printf(“ d, d, d, d, d n“, i, j, *P, *q, *r); 则程序的输出结果是 ( )。 ( A) 5, 3, 3, 5, 5 ( B) 3, 5, 5, 3, 5 ( C) 3, 5, 3, 5, 5 ( D) 5, 3, 5, 3, 5 21 有以下程序: #include int fun- (int a, int b)return a+b; int funt,(
11、int a, int b)return a-b; int sss(int(*t)( ), int x, int y) return(*t)(x, y); main() int x; x=sss(funa, 9, 3); x+=858(funb, 8, 3); printf(“ d n“, x); 程序运行后的输出结果是 ( )。 ( A) 24 ( B) 23 ( C) 17 ( D) 22 22 有以下程序: include void fun(int a, int b, intc) a=b; b=c; c=a; main( ) int a=10, b: 20, c=30; fun(a, b,
12、 c); printf(“ d, d, d n“, c, b, a); 程序运行后的输出结果是 ( )。 ( A) 10, 20, 30 ( B) 30, 20, 10 ( C) 20, 30, 10 ( D) 0, 0, 0 23 若有以下函数首都: int fun(double x10, int*n) 则下面针对此函数的函数声明语句中正确的是 ( )。 ( A) int fun(double, int); ( B) int fun(double*, int*); ( C) int fun(double*x, int n); ( D) int fun(double x, int*n); 24
13、 有以下程序: #include im f(int x); main( ) int n=1, m; m=f(f(f(n); printf(“ d n“, m); int f(int x) return x*2; 程序运行后的输出结果是 ( )。 ( A) 8 ( B) 2 ( C) 4 ( D) 1 25 有以下程序: #include int fun(int x, int y) if(x!=y) return(x+y) 2); else return(x); main( ) int a=4, b=5, c=6; printf(“ d n“, fun(2*a, fun(b, c); ( A)
14、6 ( B) 3 ( C) 8 ( D) 12 26 有以下程序: #include int f(int x, int Y) retum(y-x)*x); main( ) int a: 3, b=4, c=5, d; d=f(f(a, b), f(a, c); printf(“ d n“, d); 程序运行后的输出结果是 ( )。 ( A) 7 ( B) 10 ( C) 8 ( D) 9 27 以下叙述中正确的是 ( )。 ( A)如果函数带有参数,就不能调用自己 ( B)所有函数均不能接受函数名作为实参传人 ( C)函数体中的语句不能出现对自己的调用 ( D)函数名代表该函数的入口地址 28
15、 设有如下函数定义: #include int fun(int k) if(k 1) return 0; else if(k=1) return 1; else return fun(k-1)+1: 若执行调用语句; n=fun(3);,则函数 fun总共被调用的次数是 ( )。 ( A) 2 ( B) 3 ( C) 4 ( D) 5 29 有以下程序: #include int f(int x) int y; if(x=0 x=1)return(3); y=x*x-f(x-2); retum y; main( ) int z; z=f(3); printf(“ d n“, z); 程序的运行
16、结果是 ( )。 ( A) 0 ( B) 9 ( C) 6 ( D) 8 30 有以下程序: #include int fun(int n) if(n=1) return 1; else return(n+fun(n-1); main( ) int x; seanf(“ d“, &x); x=fun(x); printf(“ d n“, x); 执行程序时,给变量 x输入 10,程序的输出结果是 ( )。 ( A) 55 ( B) 54 ( C) 65 ( D) 45 31 有以下程序: #include void f(int b) int i; for(i=2; i void fu,12(c
17、har a, eharb) printf(“ c c“, a, b); char a=A, b=B; void funl( ) a=C; b=D; main( ) funl( ); printf(“ c c“, a, b); fun2(E, F); 程序的运行结果是 ( )。 ( A) A B E F ( B) C D E F ( C) A B C D ( D) C D A B 33 若有以下程序: include char *a=“you“; char b=“Welcome you to China!“; main( ) int i, j=0; char*P; for(i=0; bi!= 0
18、; i+) if(*a=bi) P=a; for(j=i; *P!= 0; j+) if(*P!=bj)break; P+; if(*P= 0) break; printf(“ s“, &bi); 则程序的输出结果是 ( )。 ( A) China! ( B) to ChinaI ( C) me you to China! ( D) you to China! 34 若有以下程序: #include char*a=“you“, b=“welcome#you#to#China!“; main( ) int i, j=0; char*P; for(i=0; bi!= 0; i+) if(*a=bi
19、) P=&bi; for(j=0; aj! = 0; j+) if(aj!=*P)break; P+; if(aj= 0)break; printf(“ s n!“, p); 则程序的输出结果是 ( )。 ( A) #to#China! ( B) #you#to#China! ( C) me#you#to#China! ( D) #China! 35 以下叙述中正确的是 ( )。 ( A)局部变量不能被说明为 static ( B)只有全局变量才有自己的作用域,函数中的局部变量没有作用域 ( C)只有在函数内部定义的变量才是局部变量 ( D)只要是用户定义的标识符,都有一个有效的作用域 36
20、在一个 c源程序文件中定义的全局变量,其作用域为 ( )。 ( A)由具体定义位置和 extern说明来决定范 围 ( B)所在程序的全部范围 ( C)所在函数的全部范围 ( D)所在文件的全部范围 37 在 C语言中,只有在使用时才占用内存单元的变量,其存储类型是 ( )。 ( A) auto和 static ( B) extern和 register ( C) auto和 register ( D) static和 register 38 有以下程序: #include fun(int x, int y) static int m: 0, i=2; i+=m+1; m=i+X+Y; ret
21、urn m; main( ) int j=1, m=1, k; k=fun(j, m); printf(“ d, “, k); k=fun(j, m); printf(“ d n“, k); 执行后的输出结果是 ( )。 ( A) 5, 11 ( B) 5, 5 ( C) 1l, 11 ( D) 11, 5 39 有以下程序: #include int fun( ) static int X=1; x*=2: return x; main( ) int i, S=1; for(i=1; i =3; i+) s*=fun( ); printf(“ d n“, s); 程序运行后的输出结果是 (
22、)。 ( A) 10 ( B) 30 ( C) 0 ( D) 64 40 有以下程序: #include int f(int n); main( ) int a=3, s; S=f(a); s=s+f(a); printf(“ d n“, s); int f(int n) static int a=1; n+=a+; return n; 程序运行后的输出结果是 ( )。 ( A) 9 ( B) 8 ( C) 7 ( D) 10 41 有以下程序: #include int fun( ) static int x=1: x+=1; return x; main( ) int i, s=1; fo
23、r(i=1; i =5; i+)s+=fun(); printf(“ d n“, s); 程序运行后的输出结果是 ( )。 ( A) 120 ( B) 1 1 ( C) 6 ( D) 21 国家二级 C语言机试(选择题)模拟试卷 70答案与解析 一、选择题 1 【正确答案】 A 【试题解析】 B选项中,函数 pow(x, e)错误,应该直接使用 exp(x)函数。 C选项中,函数 abs(n x+e x)错误,应该使用 fabs()返回浮点数的绝对值。 D选项中, pow(x, n)参数顺序错误。 2 【正确答案】 A 【试题解析】 不能将一个整数直接赋给指针变量作为地址,所以 A选项是错误的
24、。函数的返回值可以是地址,即指针。函数调用中形参值的变化不会传递给实参。 3 【正确答案】 D 【试题解析】 在主函数 main()中定义了两个变量 s和 i,同时给 s赋初值。 a=4,i赋初值 0。当 i=0时。执行 “s+=f(i); ”语句,调用 f()并将 i的初值 0传递 给形参n。首先执行 if语句中的条件: n 2,若条件为假,则执行 else下的语句, a=7,t=7+0=7,使用 retum返回 t, t: 7+(a+)=7+5=12,此时 a运算完后自增 l,变为6;返回主函数中, s=4+12=16。当 i=1时,执行 “s+=f(i); ”语句,调用 f()并将 i的
25、初值 l传递给形参 n。首先执行 if语句中的条件: n 2,条件为真,执行 if下面的语句, t=0, a=6 t=0+6=6,使用 retum返回 t, t=6+6=12,返回主函数中,s=16+12: 28。最后输出的结果为 28。因此 D选项正确 。 4 【正确答案】 B 【试题解析】 在主函数 main()中定义了两个变量 s和 i,同时给 s和 j赋初值 0。当 i=0时,执行 “s+=f(i); ”语句,凋用 f()并将 i的初值 0传递给形参 n。首先执行if语句中的条件: n, 2,条件为假,则执行 else下的语句, a=7 t=7+0=7使用 return返回 t, t=
26、7+(a+)=7+5=12,此时 a运算完后自增 1,变为 6;返回主函数中, s=0+12=12。当 i=1时,执行 “s+=f(i); ”语句,调用 f()并将 i的初值 1传递给形参 n。首先执行 if语句中的 条件: n 2,条件为真,执行 if下面的语句,t=0, a=6 t=0+6: 6,使用 return返回 t, t=6+6=12,返回主函数中。s=12+12=24。最后输出的结果为 24。因此 B选项正确。 5 【正确答案】 C 【试题解析】 主函数中变量 k作为 for语句的循环变量,取值 0、 l、 2、 3,同时也作为实参通过调用函数 f传递给形参变量 m。由于变量 a
27、是全局变量,变量 n是静态变量,因此 k=0时, f函数中,语句 retum n+m+a;即 l+0+3=4; k=1时, f函数中,语句 return n+m+a;即 2+1+3=6; k=2时, f函数中,语句 return n+m+a;即 3+2+3=8; k=3时, f函数中,语句: return n+m+a;即 4+3+3=10。因此 C选项正确。 6 【正确答案】 A 【试题解析】 本题重点考查的是函数的形参和实参。在定义函数时,函数名后面括弧中的变量名称为形式参数 (简称形参 );在主调函数中调用一个函数时,函数名后面括弧中的参数 (可以是一个表达式 )称为实际参数 (简称实参
28、)。 C语言中规定,实参变量对形参变量的数据传递是 “值传递 ”,即单向传递,只由实参传给形参,而不能由形 参传回来给实参。在内存中,实参单元与形参单元是不同的单元。因此 A选项正确。 7 【正确答案】 D 【试题解析】 形参是函数定义时由用户定义的形式上的变量,实参是函数调用时,主调函数为被调函数提供的原始数据。在 C语言中,实参向形参传送数据的方式是 “值传递 ”。因此 D选项正确。 8 【正确答案】 B 【试题解析】 本题重点考查函数的参数传递。函数的参数传递分为传值和传地址两种情况。本题就是结合数组考查参数传递的情形。函数 f完成的功能是对数据进行排序,语句 f(&a2, 5, 0)的
29、作用是对从 a2开始的 5个元素进行从大到小排序。注意:这里传递的是地址 &a2,所以排序操作可看做是直接对数组 a操作,执行后的结果为 5, 4, 7, 6, 3, 2, 1, 8, 9, 10。语句 f(a, 5, 1)对数组 a的前5个元素从小到大排序,排序后数组为: 3, 4, 5, 6, 7, 2, 1, 8, 9, 10。因此B选项正确。 9 【正确答案】 B 【试题解析】 在函数中允许有多个 return语句,但每次调用只能有一个 return语句被执行,因此只能返回一个函数值,故 A选项描述错误。定义成 void类型的函数,不允许从该函数取得返回值, 也不允许使用 return
30、语句,故 C选项描述错误。没有 return语句的函数在执行到函数的最后一条语句后会自动返回到调用处,故 D选项描述错误。因此 B选项正确。 10 【正确答案】 A 【试题解析】 返回值为指针变量指向的数据,该数据已被定义为整型。因此 A选项正确。 11 【正确答案】 B 【试题解析】 本题重点考查函数返回值的相关知识。函数的值只能通过 return语句返回主调函数,在函数中允许有多个 return语句,但每次调用只能有一个return语句被执行,因此只能返回一个函数值。不返回 函数值的函数,可以明确定义为 “空类型 “,类型说明符为 “void“。因此 B选项正确。 12 【正确答案】 A
31、【试题解析】 在调用子函数时,应对其进行说明。 A选项中,调用时,没有对子函数进行说明。 B选项和 C选项中,被调用函数在主调函数之前定义,不用说明; D选项中,在主函数中对被调用函数的返回值类型进行了说明。因此 A选项正确。 13 【正确答案】 A 【试题解析】 函数调用中发生的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化,所以数组 c中的元素的值并没有变化,故选择A。 14 【正确答案】 C 【试题解析】 本题重点考查函数的定义和调用。第一次循环, a=0, i=0,返回值a=0*0+1=1;第
32、二次循环, a=1, i=10,返回值 a=10*10+1+1=102;第三次循环,a=102, i=20,返回值 a=20*20+1+102=503;第四次循环, a=503, i=30,不符合i30,跳出循环,最后结果输出 a=503。 15 【正确答案】 D 【试题解析】 语句 int m=1, n=2, *p=&m, *q=&n, *r;表示指针变量 p指向m,指针变量 q指向 n;语句 r=p; p=q; q=r;表示通过指针变量 r,将指针 p和指针 q指向交换。因此最后输出 1, 2, 2, 1。 16 【正确答案】 A 【试题解析】 本题考查的是函数的地址调用。将数组名作为数组
33、首地址进行传递,然后取数据元素值进行加 l运算。因此 A选项正确。 17 【正确答案】 A 【试题解析】 fun函数的功能是交换形式参数的值,即交换指针变量 a和 b的值。但是 fun函数并不能够交换实参的值,因此 fun(p, q)不能交换 p和 q的值,所以第一个 pfintf语句的输出为 3, 5。第二个 fun函数对 x和 y的地址进行了操作,同样不能交换 x和 y的值,但并不影响 p和 q指针指向的数据,因此第二个printf语句的输出也是 3, 5。因此 A选项正确。 18 【正确答案】 A 【试题解析】 该题目中 fun函数的功能是将 a所指数组元素从大到小排序,fun(c+4,
34、 6);即指排序从第 5个元素开始进行从大到小排序。因此 A选项正确。 19 【正确答案】 C 【试题解析】 首先在主函数中给整型变量 k赋值为 3,调用 sp函数,将变量 k的地址作为实 参传递给形参指针变量 a;在 sp函数中, *a=*a*2;即结果为 6,由于指针变量 a指向地址 k,所以 k值此时也变成 6,通过 printf()函数输出。整型变量 b的地址赋给指针变量 a,再执行 *a=*a*2;语句,即结果为 4,通过 printf()函数输出。返回主函数,输出 k的值 6。因此 C选项正确。 20 【正确答案】 D 【试题解析】 在主函数中分别给整型变量 i、 j和指针型变量
35、p、 q赋初值,并声明指针变量 r;调用 f函数,并将实参变量 p和 q的值传递给形参变量 s和 t,并且 f函数是指针型函数,即函数的返回值将是一 个地址。在 f函数中,如果条件成立,则将指针变量 s和 t的值互换,并且将指针 s的地址返回主函数。最后输出i, j, *p, *q, *r的值,即 5, 3, 5, 3, 5。因此 D选项正确。 21 【正确答案】 C 【试题解析】 本题主要考查函数作为形参时的使用。由 x=sss(funa, 9, 3);可得到 x=9+3=12,而后直接传人函数 funb, x=x+8-3=12+5=17。因此 C选项正确。 22 【正确答案】 B 【试题解
36、析】 本题主要考查函数形参的值传递。函数调用中发生的数据传送是单向的,即只能把实参的 值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。因此 B选项正确。 23 【正确答案】 B 【试题解析】 函数声明的一般形式为:类型说明符被调函数名 (类型形参,类型形参, ) ;或者为:类型说明符被调函数名 (类型,类型, ) ;由于函数首部为int fun(doublex10, int*n),因此 B选项正确。 24 【正确答案】 A 【试题解析】 第一次调用 m=f(f(f(1),第二次为 m=f(f(2),第三次为 m=f(4),即返回值为
37、 8,因此选择 A。 25 【正确答案】 A 【试题解析】 本题中第一次调用为 fun(8, fun(5, 6),因为 fun(5, 6)返回值为5,所以第二次调用为 fun(8, 5)=6,故以选择 A。 26 【正确答案】 D 【试题解析】 调用 f(a, b)函数返回 3,调用 f(a, c)函数返回 6,所以外层调用f(f(a, b), f(a, c);即调用 f(3, 6)函数返回 9。 27 【正确答案】 D 【试题解析】 本题考查函数调用的相关知识。 B选项中函数可以接受函数名作为实参传人,引 用函数名也是指针, C、 A选项是错误的,因为递归函数就能调用自己。 28 【正确答案
38、】 B 【试题解析】 首先 n=fun(3), 3被当做参数传递进去,这就进行了一次调用, 3被当做参数传进去后,程序会执行这句 else return fun(k-1)+1;,这就调用了第二次,而参数是 3-1也就是 2。 2被当做参数传进去后,程序会执行这句 else return fun(k-1)+1;,这就调用了第三次,而参数是 2一 1也就是 1。 1被当做参数传进去后,程序会执行这句 else if(k=1)return 1;, 不再递归调用,所以最终结果为 3次。 29 【正确答案】 C 【试题解析】 主函数中调用 f函数,同时将数值 3传递给变量 x,不符合条件x=0 x=1,
39、跳过 return(3);,直接执行语句 y=x*x-f(x-2);这里 f(x-2)为函数的递归调用,再次调用 f函数,此时 x=1,条件语句条件成立,返回 3给 f(1),y=3*3-3=6,最后将 6返回主函数,并进行输出。因此 C选项正确。 30 【正确答案】 A 【试题解析】 该程序考查的是函数的递归调用。在调用一个函数的过程中又出现直接或间 接地调用该函数本身,称为函数的递归调用,执行结果为1+2+3+8+9+10=55 。因此 A选项正确。 31 【正确答案】 B 【试题解析】 数组名是常量,表示的是数组首元素的地址。当执行 f(a)的时候,由于传递的是首地址,相当于直接对数组
40、a进行操作,所以从数组 a的第三个元素 a2到元素 a5,每个元素值扩大两倍。因此 B选项正确。 32 【正确答案】 B 【试题解析】 本题考查的是变量的作用范围。如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被 “屏蔽 ”,即不起作用。本题中,在 funl()和 main()函数内访问的是全局变量 a和 b,在 fun2()函数中访问的是形参变量 a和 b。所以, main()函数中的 prinff()函数输出的是在 funl()函数中被改变的全局变量 a和 b的值 C D,而 fun2()函数中输出的是传递给它的实参值 E F。因此 B选项正确。 33 【
41、正确答案】 D 【试题解析】 该程序首先定义 *c a和 b,并进行初始化。主函数中通过外层 for循环语句,遍历字符数组 b,并且将符合 if条件语句的字符赋给数组 p; for内层循环语句,遍 历字符数组 a。再将符合 if条件语句的结果输出。因此 D选项正确。 34 【正确答案】 A 【试题解析】 该程序首先定义, *a和 b,并进行初始化。主函数中通过外层for循环语句,遍历字符数组 b,并且将符合 if条件语句的字符赋给数组 p; for内层循环语句,遍历字符数组 a。再将符合 if条件语句的结果输出。因此 A选项正确。 35 【正确答案】 D 【试题解析】 本题考查局部变量和全局变
42、量作用域。在 B选项中,局部变量也有作用域;在 C选项中,函数内部定义的也可能是全局变量;在 A选项中, 局部变量可以定义为静态局部变量。 36 【正确答案】 A 【试题解析】 全局变量的作用域是从声明处到文件的结束。所以选择 A。 37 【正确答案】 C 【试题解析】 auto:函数中的局部变量,动态地分配存储空间,数据存储在动态存储区中,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。 register:为了提高效率, C语言允许将局部变量的值放在CPU的寄存器中,这种变量叫 “寄存器变量 ”,只有局部自动变量和形式参数可以作为寄存器变量。 extern:外
43、部变量 (即 全局变量 )是在函数的外部定义的,它的作用域从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。 static:静态局部变量属于静态存储类别,在静态存储区内分配存储单元。静态局部变量在程序整个运行期间都不释放。 38 【正确答案】 A 【试题解析】 声明静态局部变量:函数调用结束后,其占用的存储单元不释放,在下次该函数调用时,该变量保留上一次函数调用结束时的值。本题子函数 fun中的变量 i和 m均为静态局部变量。所以第一次调用 fun函数,返回 m的值 为5,第二次再调用 fun函数时, i的值为 3, m的值已经是 5
44、了,所以执行 i+=m+1后, i的值变为 9, m=i+x+y=9+1+1=11。 39 【正确答案】 D 【试题解析】 在本题中,静态局部变量 x在静态存储区内分配存储单元,在程序整个运行期间都不释放。所以第一次循环 s的值为 2,在第二次循环中,返回的 x的值为 4,所以 s的值为 8,第三次循环,返回的 x的值为 8,所以 s的值为 64。 40 【正确答案】 A 【试题解析】 题目中的静态局部变量 a,在静态存储区内分配存储单元,在程序整个运行期间都不 释放。所以第一次调用函数执行 n+=a+;时 a先与 n相加在再进行自增。 n的值为 4, a的值为 2,且 a变量执行完后空间没有释放。再执行s=s+f(a)时, s的值为 4,调用 f(a)函数时 n的返回值为 n=3+2=5,此时 a的值为3。所以 s的值为 9。 41 【正确答案】 D 【试题解析】 fun函数中的变量 x为静态局部变量,占用固定的内存单元,下一次调用时仍可以保留上次调用时的值。也就是说,如果多次调用 fun函数, x的定义只在第一个调用时有效,从第二次调用开始, x的定义相当于不存在,直接使用上次 x的值。 fun函数被调用了 5次,每次调用后的返回值累加并赋予 s。 5次调用后, x的值为 6, s的值为 21。因此 D选项正确。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1