第7章 第8节:作用域和存储类型(练习)-《C语言程序设计》(电子工业出版社)上好课

2026-04-30
| 2份
| 32页
| 34人阅读
| 0人下载

内容正文:

7.8节:作用域和存储类型 一、单项选择题 1.全局变量的存储类型默认是( ) A. auto B. static C. register D. extern 2.以下关于 static 修饰局部变量的说法,正确的是() A. 存储类型变为 register,运行速度更快 B. 变量的生存期变为整个程序运行期间 C. 变量的作用域扩大到整个文件 D. 每次函数调用时都会重新初始化 3.关于变量作用域的概念,下列描述正确的是() A. 变量作用域是指变量占用的内存大小 B. 变量作用域是指变量能被访问的有效范围 C. 变量作用域由变量的存储类型直接决定 D. 变量作用域与变量的生存期完全一致 4.局部变量和全局变量同名时,在局部作用域内访问的是() A. 全局变量 B. 局部变量 C. 编译错误(命名冲突) D. 随机访问其中一个 5.以下关于静态局部变量(static修饰的局部变量)的描述,错误的是() A. 静态局部变量的生存期贯穿整个程序运行期间,但作用域仍限于定义它的函数。 B. 静态局部变量若未显式初始化,系统会自动初始化为0。 C. 每次调用包含静态局部变量的函数时,该变量都会重新初始化。 D. 静态局部变量存储在静态存储区,而非栈区。 6.以下代码的输出结果是() #include <stdio.h> int x = 5; void func() { int x = 10; printf("%d ", x);} main() { func(); printf("%d", x);} A. 10 5 B. 5 10 C. 10 10 D. 5 5 7.以下关于extern关键字的描述,正确的是() A. extern用于定义新的全局变量,分配存储空间 B. extern用于声明已存在的全局变量,不分配存储空间 C. extern只能用于局部变量,扩展其作用域到整个程序 D. extern修饰的变量会自动初始化为0 8.以下代码中,count变量的输出结果是() #include <stdio.h> void increment() { static int count = 0; count++; printf("%d ", count);} main() { increment(); increment();} A. 1 1 B. 1 2 C. 0 1 D. 2 2 9.以下代码的输出结果是() #include <stdio.h> int a = 1; void func(int a) { a = 5; printf("%d ", a);} main() { func(a); printf("%d", a);} A. 5 1 B. 1 5 C. 5 5 D. 1 1 10.以下代码的输出结果是() #include <stdio.h> int x = 5; void func() { extern int x; x = 10;} main() { func(); printf("%d", x);} A. 5 B. 10 C. 0 D. 随机值 二、填空题。 1.以下代码中,y的输出结果是___________。 #include <stdio.h> main() { static int y; printf("%d", y);} 2.以下代码的输出结果是___________。 #include <stdio.h> int a = 1; main() { int a = 2; { int a = 3; printf("%d ", a); } printf("%d ", a);} 3.以下代码中,x的输出结果是___________。 #include <stdio.h> void func() { auto int x = 5; printf("%d ", x);} main() { func();} 4.以下代码的输出结果是___________。 #include <stdio.h> int x = 10; void func() { x = 20;} main() { func(); printf("%d", x);} 5.以下代码中,count的输出结果是___________。 #include <stdio.h> void func() { static int count = 1; count *= 2; printf("%d ", count);} main() { func(); func(); func();} 6.C语言中,变量的作用域分为______作用域和______作用域两种。 7.局部变量的存储类型默认为______,可省略关键字。 8.extern关键字用于______全局变量,而非______。 9.形式参数的作用域是___________。 10.全局变量的作用域从______开始,到______结束。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> int x = 1; void func() { int x = 2; printf("%d ", x);} main() { func(); printf("%d", x);} 2.写出下列程序段的输出结果:________________。 #include <stdio.h> void func() { static int count = 0; count += 5; printf("%d ", count);} main() { func(); func();} 3.写出下列程序段的输出结果:________________。 #include <stdio.h> void func(int x) { x = 100; printf("%d ", x); } main() { int x = 50; func(x); printf("%d", x);} 4.写出下列程序段的输出结果:________________。 #include <stdio.h> int x = 5; void func() { extern int x; x = 10;} main() { func(); printf("%d", x);} 5.写出下列程序段的输出结果:________________。 #include <stdio.h> int x = 1; void func() { x++; printf("%d ", x);} main() { func(); func();} 6.写出下列程序段的输出结果:________________。 #include <stdio.h> void func() { static int x = 1; x *= 3; printf("%d ", x);} main() { func(); func();} 7.写出下列程序段的输出结果:________________。 #include <stdio.h> int x = 2; main() { int x = 1; printf("%d ", x); x = 3; { int x = 4; printf("%d ", x); } printf("%d ", x);} 8.写出下列程序段的输出结果:________________。 static int x = 5; main() { int x = 3; printf("%d ", x); x = 7; { static int x = 2; x++; printf("%d ", x);} printf("%d ", x);} 9.写出下列程序段的输出结果:________________。 int count = 0; void add() { static int num = 0; num++; count++; printf("num=%d, count=%d ", num, count);} main() { add(); add();} 10.写出下列程序段的输出结果:________________。 #include <stdio.h> main() { int i; for (i = 0; i < 2; i++) { static int j = 0; j += i; printf("%d ", j); } } 11.写出下列程序段的输出结果:________________。 #include <stdio.h> int x = 5; void func1() { static int x = 10; x += 5; printf("func1: x=%d ", x); } void func2() { x += 2; printf("func2: x=%d ", x); } main() { int x = 0; { extern int x; printf("main1: x=%d ", x); } func1(); func2(); func1(); printf("main2: x=%d ", x);} 12.写出下列程序段的输出结果:________________。 #include <stdio.h> int i; int global_arr[5] = {1, 2, 3, 4, 5}; void process() { static int static_arr[3] = {0, 0, 0}; auto int auto_arr[3] = {0, 0, 0}; for(i = 0; i < 3; i++) { static_arr[i] += global_arr[i]; auto_arr[i] += global_arr[i]; } for(i = 0; i < 3; i++) { printf("s[%d]=%d a[%d]=%d ",i,static_arr[i],i,auto_arr[i]); } printf(" ");} main() { process(); for(i = 0; i < 5; i++) { global_arr[i] *= 2; } process();} 13.写出下列程序段的输出结果:________________。 #include <stdio.h> int a = 1,i; void func() { static int s = 0; auto int b = 0; for(i = 0; i < 3; i++) { s += a; b += a; a++; } printf("s=%d b=%d ", s, b); } main() { func(); a = 2; func(); printf("a=%d", a);} 14.写出下列程序段的输出结果:________________。 #include <stdio.h> int val = 3,i; void transform() { register int r = 0; static int s = 0; for(i = 0; i < 4; i++) { r += val; s += val; { extern int val; val++; } } printf("r=%d s=%d ", r, s); } main() { transform(); val = 1; transform();} 15.写出下列程序段的输出结果:________________。 #include <stdio.h> int a = 2, b = 3,i,j; void nested() { static int x = 0; auto int y = 0; for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { x += a; y += b; a++; b--; } } printf("x=%d y=%d ", x, y); } main() { nested(); a = 1; b = 2; nested(); printf("a=%d b=%d", a, b);} 16. 写出下列程序段的输出结果:________________。 #include <stdio.h> int matrix[2][2] = {{1, 2}, {3, 4}}; void calculate() { auto int i,j; static int total = 0; int current = 0; for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { total += matrix[i][j]; current += matrix[i][j]; matrix[i][j] += 1; } } printf("total=%d current=%d ", total, current); } main() { calculate(); calculate();} 17.写出下列程序段的输出结果:________________。 #include <stdio.h> int seq[4] = {2, 4, 6, 8}; void process_seq() { static int even_sum = 0; int odd_sum = 0; auto int i; for(i = 0; i < 4; i++) { if(i % 2 == 0) { even_sum += seq[i]; } else { odd_sum += seq[i]; } seq[i] += 3; } printf("even=%d odd=%d ", even_sum, odd_sum); } main() { process_seq(); process_seq();} 18.写出下列程序段的输出结果:________________。 #include <stdio.h> int numbers[5] = {1, 3, 5, 7, 9}; void compute() { static int product = 1; int sum = 0; auto int i; for(i = 0; i < 5; i++) { if(numbers[i] % 2 == 1) { product *= numbers[i]; } sum += numbers[i]; numbers[i] += 2; } printf("product=%d sum=%d ", product, sum); } main() { compute(); compute();} 19.写出下列程序段的输出结果:________________。 #include <stdio.h> int grid[2][2] = {{1, 2}, {3, 4}}; void matrix_op() { static int diag_sum = 0; int all_sum = 0; auto int i,j; for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { all_sum += grid[i][j]; if(i == j) { diag_sum += grid[i][j]; } grid[i][j] += 3; } } printf("diag=%d all=%d ", diag_sum, all_sum); } main() { matrix_op(); matrix_op();} 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $ 7.8节:作用域和存储类型 一、单项选择题 1.全局变量的存储类型默认是( ) A. auto B. static C. register D. extern 【答案】D 【解析】全局变量默认的链接属性为 extern,可被其他文件访问,D 正确;auto 仅用于局部变量,static 用于限制作用域,register 用于请求寄存器存储。 2.以下关于 static 修饰局部变量的说法,正确的是( ) A. 存储类型变为 register,运行速度更快 B. 变量的生存期变为整个程序运行期间 C. 变量的作用域扩大到整个文件 D. 每次函数调用时都会重新初始化 【答案】B 【解析】static 修饰的局部变量存储在静态存储区,生存期为整个程序运行期间,B 正确;register 是寄存器存储类型,A 错误;作用域仍限于定义它的函数内,C 错误;仅在第一次调用时初始化,后续调用保留上次的值,D 错误。 3.关于变量作用域的概念,下列描述正确的是( ) A. 变量作用域是指变量占用的内存大小 B. 变量作用域是指变量能被访问的有效范围 C. 变量作用域由变量的存储类型直接决定 D. 变量作用域与变量的生存期完全一致 【答案】B 【解析】作用域是变量可访问的范围,内存大小属存储范畴;存储类型影响生存期和作用域但非直接决定;作用域与生存期是独立概念(如全局变量作用域大但生存期长)。 4.局部变量和全局变量同名时,在局部作用域内访问的是( ) A. 全局变量 B. 局部变量 C. 编译错误(命名冲突) D. 随机访问其中一个 【答案】B 【解析】作用域遵循“就近原则”,局部作用域内同名时优先访问局部变量,全局变量被隐藏。 5.以下关于静态局部变量(static修饰的局部变量)的描述,错误的是( ) A. 静态局部变量的生存期贯穿整个程序运行期间,但作用域仍限于定义它的函数。 B. 静态局部变量若未显式初始化,系统会自动初始化为0。 C. 每次调用包含静态局部变量的函数时,该变量都会重新初始化。 D. 静态局部变量存储在静态存储区,而非栈区。 【答案】C 【解析】静态局部变量仅在第一次调用函数时初始化,后续调用不会重新初始化,C错误 6.以下代码的输出结果是( ) #include <stdio.h> int x = 5; void func() { int x = 10; printf("%d ", x);} main() { func(); printf("%d", x);} A. 10 5 B. 5 10 C. 10 10 D. 5 5 【答案】A 【解析】func函数内的x是局部变量(值10),因此func中输出10;main函数中未定义局部x,访问的是全局变量x(值5),因此输出“10 5”。 7.以下关于extern关键字的描述,正确的是( ) A. extern用于定义新的全局变量,分配存储空间 B. extern用于声明已存在的全局变量,不分配存储空间 C. extern只能用于局部变量,扩展其作用域到整个程序 D. extern修饰的变量会自动初始化为0 【答案】B 【解析】extern是“外部声明”,用于告诉编译器该变量已在其他文件或位置定义,不分配存储空间(A错误,B正确);extern仅用于全局变量(C错误);初始化由定义处决定,extern声明不影响初始化(D错误)。 8.以下代码中,count变量的输出结果是( ) #include <stdio.h> void increment() { static int count = 0; count++; printf("%d ", count);} main() { increment(); increment();} A. 1 1 B. 1 2 C. 0 1 D. 2 2 【答案】B 【解析】静态局部变量count仅在第一次调用increment时初始化为0,之后每次调用count++会保留上一次的值。第一次调用后count=1,第二次调用后count=2,因此输出“1 2”。 9.以下代码的输出结果是( ) #include <stdio.h> int a = 1; void func(int a) { a = 5; printf("%d ", a);} main() { func(a); printf("%d", a);} A. 5 1 B. 1 5 C. 5 5 D. 1 1 【答案】A 【解析】形式参数a是func的局部变量,与全局变量a无关。func内修改的是局部a(值5),main中访问的是全局a(值1),因此输出“5 1”。 10.以下代码的输出结果是( ) #include <stdio.h> int x = 5; void func() { extern int x; x = 10;} main() { func(); printf("%d", x);} A. 5 B. 10 C. 0 D. 随机值 【答案】B 【解析】func中extern int x声明了外部全局变量x,因此func内修改的是全局x(从5改为10),main中输出全局x的值为10。 二、填空题。 1.以下代码中,y的输出结果是___________。 #include <stdio.h> main() { static int y; printf("%d", y);} 【答案】0 【解析】静态局部变量若未显式初始化,系统会自动初始化为0,因此输出0。 2.以下代码的输出结果是___________。 #include <stdio.h> int a = 1; main() { int a = 2; { int a = 3; printf("%d ", a); } printf("%d ", a);} 【答案】3 2 【解析】最内层块({})内的a是3,输出3;中间层(main内)的a是2,输出2;全局a被屏蔽,因此输出“3 2”。 3.以下代码中,x的输出结果是___________。 #include <stdio.h> void func() { auto int x = 5; printf("%d ", x);} main() { func();} 【答案】5 【解析】func内的x是自动变量(auto可省略),块内访问合法,输出5 4.以下代码的输出结果是___________。 #include <stdio.h> int x = 10; void func() { x = 20;} main() { func(); printf("%d", x);} 【答案】20 【解析】func内未定义局部x,因此修改的是全局变量x(从10改为20),main中输出20。 5.以下代码中,count的输出结果是___________。 #include <stdio.h> void func() { static int count = 1; count *= 2; printf("%d ", count);} main() { func(); func(); func();} 【答案】2 4 8 【解析】静态局部变量count第一次初始化为1,第一次调用后count=2,第二次调用后count=4,第三次调用后count=8,因此输出“2 4 8”。 6.C语言中,变量的作用域分为______作用域和______作用域两种。 【答案】全局;局部 【解析】变量作用域分为全局(整个文件或程序)和局部(函数或块内)。 7.局部变量的存储类型默认为______,可省略关键字。 【答案】auto 【解析】局部变量默认存储类型为auto,可省略不写。 8.extern关键字用于______全局变量,而非______。 【答案】声明;定义 【解析】extern是外部声明,不分配存储空间(非定义)。 9.形式参数的作用域是___________。 【答案】整个函数体 【解析】形式参数作为局部变量,作用域覆盖整个函数。 10.全局变量的作用域从______开始,到______结束。 【答案】定义位置;源文件结束 【解析】全局变量作用域从定义处开始,到所在源文件结束。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> int x = 1; void func() { int x = 2; printf("%d ", x);} main() { func(); printf("%d", x);} 【答案】2 1 2.写出下列程序段的输出结果:________________。 #include <stdio.h> void func() { static int count = 0; count += 5; printf("%d ", count);} main() { func(); func();} 【答案】5 10 3.写出下列程序段的输出结果:________________。 #include <stdio.h> void func(int x) { x = 100; printf("%d ", x); } main() { int x = 50; func(x); printf("%d", x);} 【答案】100 50 4.写出下列程序段的输出结果:________________。 #include <stdio.h> int x = 5; void func() { extern int x; x = 10;} main() { func(); printf("%d", x);} 【答案】10 5.写出下列程序段的输出结果:________________。 #include <stdio.h> int x = 1; void func() { x++; printf("%d ", x);} main() { func(); func();} 【答案】2 3 6.写出下列程序段的输出结果:________________。 #include <stdio.h> void func() { static int x = 1; x *= 3; printf("%d ", x);} main() { func(); func();} 【答案】3 9 7.写出下列程序段的输出结果:________________。 #include <stdio.h> int x = 2; main() { int x = 1; printf("%d ", x); x = 3; { int x = 4; printf("%d ", x); } printf("%d ", x);} 【答案】1 4 3 8.写出下列程序段的输出结果:________________。 static int x = 5; main() { int x = 3; printf("%d ", x); x = 7; { static int x = 2; x++; printf("%d ", x);} printf("%d ", x);} 【答案】3 3 7 9.写出下列程序段的输出结果:________________。 int count = 0; void add() { static int num = 0; num++; count++; printf("num=%d, count=%d ", num, count);} main() { add(); add();} 【答案】num=1, count=1 num=2, count=2 10.写出下列程序段的输出结果:________________。 #include <stdio.h> main() { int i; for (i = 0; i < 2; i++) { static int j = 0; j += i; printf("%d ", j); } } 【答案】0 1 11.写出下列程序段的输出结果:________________。 #include <stdio.h> int x = 5; void func1() { static int x = 10; x += 5; printf("func1: x=%d ", x); } void func2() { x += 2; printf("func2: x=%d ", x); } main() { int x = 0; { extern int x; printf("main1: x=%d ", x); } func1(); func2(); func1(); printf("main2: x=%d ", x);} 【答案】main1: x=5 func1: x=15 func2: x=7 func1: x=20 main2: x=0 12.写出下列程序段的输出结果:________________。 #include <stdio.h> int i; int global_arr[5] = {1, 2, 3, 4, 5}; void process() { static int static_arr[3] = {0, 0, 0}; auto int auto_arr[3] = {0, 0, 0}; for(i = 0; i < 3; i++) { static_arr[i] += global_arr[i]; auto_arr[i] += global_arr[i]; } for(i = 0; i < 3; i++) { printf("s[%d]=%d a[%d]=%d ",i,static_arr[i],i,auto_arr[i]); } printf(" ");} main() { process(); for(i = 0; i < 5; i++) { global_arr[i] *= 2; } process();} 【答案】 s[0]=1 a[0]=1 s[1]=2 a[1]=2 s[2]=3 a[2]=3 s[0]=3 a[0]=2 s[1]=6 a[1]=4 s[2]=9 a[2]=6 13.写出下列程序段的输出结果:________________。 #include <stdio.h> int a = 1,i; void func() { static int s = 0; auto int b = 0; for(i = 0; i < 3; i++) { s += a; b += a; a++; } printf("s=%d b=%d ", s, b); } main() { func(); a = 2; func(); printf("a=%d", a);} 【答案】s=6 b=6 s=15 b=9 a=5 14.写出下列程序段的输出结果:________________。 #include <stdio.h> int val = 3,i; void transform() { register int r = 0; static int s = 0; for(i = 0; i < 4; i++) { r += val; s += val; { extern int val; val++; } } printf("r=%d s=%d ", r, s); } main() { transform(); val = 1; transform();} 【答案】r=18 s=18 r=10 s=28 15.写出下列程序段的输出结果:________________。 #include <stdio.h> int a = 2, b = 3,i,j; void nested() { static int x = 0; auto int y = 0; for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { x += a; y += b; a++; b--; } } printf("x=%d y=%d ", x, y); } main() { nested(); a = 1; b = 2; nested(); printf("a=%d b=%d", a, b);} 【答案】x=14 y=6 x=24 y=2 a=5 b=-2 16. 写出下列程序段的输出结果:________________。 #include <stdio.h> int matrix[2][2] = {{1, 2}, {3, 4}}; void calculate() { auto int i,j; static int total = 0; int current = 0; for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { total += matrix[i][j]; current += matrix[i][j]; matrix[i][j] += 1; } } printf("total=%d current=%d ", total, current); } main() { calculate(); calculate();} 【答案】total=10 current=10 total=24 current=14 17.写出下列程序段的输出结果:________________。 #include <stdio.h> int seq[4] = {2, 4, 6, 8}; void process_seq() { static int even_sum = 0; int odd_sum = 0; auto int i; for(i = 0; i < 4; i++) { if(i % 2 == 0) { even_sum += seq[i]; } else { odd_sum += seq[i]; } seq[i] += 3; } printf("even=%d odd=%d ", even_sum, odd_sum); } main() { process_seq(); process_seq();} 【答案】even=8 odd=12 even=22 odd=18 18.写出下列程序段的输出结果:________________。 #include <stdio.h> int numbers[5] = {1, 3, 5, 7, 9}; void compute() { static int product = 1; int sum = 0; auto int i; for(i = 0; i < 5; i++) { if(numbers[i] % 2 == 1) { product *= numbers[i]; } sum += numbers[i]; numbers[i] += 2; } printf("product=%d sum=%d ", product, sum); } main() { compute(); compute();} 【答案】product=945 sum=25 product=9823275 sum=35 19.写出下列程序段的输出结果:________________。 #include <stdio.h> int grid[2][2] = {{1, 2}, {3, 4}}; void matrix_op() { static int diag_sum = 0; int all_sum = 0; auto int i,j; for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { all_sum += grid[i][j]; if(i == j) { diag_sum += grid[i][j]; } grid[i][j] += 3; } } printf("diag=%d all=%d ", diag_sum, all_sum); } main() { matrix_op(); matrix_op();} 【答案】diag=5 all=10 diag=16 all=22 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

第7章 第8节:作用域和存储类型(练习)-《C语言程序设计》(电子工业出版社)上好课
1
第7章 第8节:作用域和存储类型(练习)-《C语言程序设计》(电子工业出版社)上好课
2
第7章 第8节:作用域和存储类型(练习)-《C语言程序设计》(电子工业出版社)上好课
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。