首页 > 试题广场 >

下面程序会输出什么

[单选题]
下面程序会输出什么:
#include <stdio.h>
#include <string.h>
static int a = 1;
void fun1(void) { a = 2; }
void fun2(void) { int a = 3; }
void fun3(void) { static int a = 4; }
int main() {
    printf("%d", a);
    fun1();
    printf("%d", a);
    fun2();
  printf("%d", a); 

  fun3( );

  printf("%d", a);
}

  • 1 2 3 4
  • 1 2 2 2
  • 1 2 2 4
  • 1 1 1 4
没答案的  分配的地址是一样的
发表于 2015-08-11 20:30:12 回复(0)
首先声明了一个静态全局变量i,首次输出我就不说了,妥妥的1。第二次输出,访问到了早已定义的全局变量i,并改写值,第二次为2。第三次输出,内部定义了一个同名的变量, 它并没有返回值或者被该次执行程序以外任何程序读取a值,所以第三次输出仍然是a。第四次输出,定义了一个静态的局部变量,静态局部变量在函数调用结束后仍然存在,及它的内存空间不会被释放,但其他函数是不能引用它的,所以,两个静态变量虽然同名,但是并不是一样的东西,为2。答案是B
发表于 2015-08-10 11:53:31 回复(4)
B。
第一个printf打印静态全局变量a的值,为1。
fun1()对全局变量a重新赋值为2,因此第二个打印为2。
fun2()在函数内部重新声明了一个变量a,然后对该变量a赋值,该函数的作用域是本函数,并不影响全局变量a,因此第三个printf仍然为2。
fun3()在函数内部声明了一个静态变量a,并将其赋值为4,虽然该变量在函数执行结束后并不回收,但是其作用域仅限于本函数内部,printf同样不时,仍然是外部的全局变量a的值。
发表于 2015-08-12 15:03:32 回复(1)
这点其实最关键的考点是:静态局部变量和全局变量的区别(也就是最后一次为何输出2) 静态局部变量虽然和全局变量都存放在全局数据区,延长了生命周期,但是作用域不同!作用域不同!作用域不同!重要的事情说三遍,静态局部变量仍然是个局部变量,只对函数内可见。
发表于 2016-10-03 13:27:55 回复(0)
func1中没有定义a;所以func1中的a是函数外部定义的全局变量,此时a被重新赋值为2;而func2和func3中都重新定义了a,对于func2中的a,此处的a是局部变量,只在本函数体内有效,函数完成后直接销毁。func3中的a为静态变量(只分配一次内存),虽然函数完成后a不会销毁,但也只在函数内部才会生效,所以main函数中打印的都是全局变量a
发表于 2015-08-08 21:50:32 回复(2)
考察的是全局变量只能初始化一次,在调用过程中其值不变。
发表于 2015-08-09 17:22:15 回复(0)
百度百科
(1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
发表于 2018-05-02 16:21:19 回复(0)
1.首先定义的是一个静态全局变量,而fun1中没有重新定义a的值,只是重新赋值了,所以用的还是全局变量a,故这里a的值为2,fun2中则重新定义了a的值,但只是作用于该函数内部,在main函数调用结束以后,会被释放掉,故这里的值任然是上一次a的值,即为2,fun3中定义了一个静态重名的局部变量,类似于fun2,在主函数调用后会被释放掉,打印的还是全局变量a的值,故为2
发表于 2020-12-03 17:13:53 回复(0)
我把这段代码粘贴在vc6.0中,确实没有正确答案,答案如下,考虑应该是变量名与main函数参数相同的问题。但,若是将main的第二个参数改为其他名称,则答案是1 2 2 2


发表于 2015-08-09 21:53:02 回复(3)
fun1,fun2改变的是全局静态变量的值,fun3,fun4定义的a都是局部变量,不管是不是静态的,他们的作用域都是到这个函数结束,而main函数中只能访问到的是前面定义的全局静态变量。静态局部变量不会在函数调用结束后就消失,他的生存时间和全局静态变量是一样的,作用域不同。
发表于 2015-08-12 14:26:54 回复(0)
staticinta=1;一开始定义的是静态 全局变量
voidfun1(void)
{
    a=2;
}
fun1使用的是全局变量,会发生 静态 全局变量的改变 。注意看清楚不是重新定义的局部变量
fun2中重新定义了局部变量a 在函数内部使用的是局部变量,函数调用结束后就会释放了
fun3中重新定义了同名的局部静态变量 在函数内部使用局部变量的值 函数调用结束后 局部变量还是存在的
发表于 2015-08-10 16:40:49 回复(0)
这道题应该写错了吧,按照题面,应该输出main函数中形参a的地址,就没有正确答案,
发表于 2015-08-09 11:33:38 回复(1)
局部定义的变量始终不影响全局变量,static关键字影响的是变量的生存周期
发表于 2024-09-17 17:56:08 回复(0)
1. 初始时,全局变量`a`被定义并初始化为1,所以第一个输出为1。 2. 在函数`fun1()`中,将全局变量`a`的值修改为2。 3. 调用函数`fun2()`中定义了一个局部变量`a`,并将其初始化为3。但是这个局部变量`a`和全局变量`a`是两个不同的变量,它的作用域仅限于函数`fun2()`,并不会影响全局变量`a`的值。因此第三个输出仍然为2。 4. 调用函数`fun3()`中定义了一个静态局部变量`a`,并将其初始化为4。静态局部变量的生命周期与全局变量类似,但是作用域仅限于函数`fun3()`。函数`fun3()`被调用时,静态局部变量`a`被重新初始化为4,但并不会影响全局变量`a`的值。因此最后一个输出仍然为2。
发表于 2023-10-10 00:24:47 回复(0)
全局变量和局部变量!
发表于 2023-07-22 16:56:56 回复(0)
关于这位大佬的说法,感觉是很nice的,但是有个疑问:f2能访问得到static int a = 1吗?
头像
首先声明了一个静态全局变量i,首次输出我就不说了,妥妥的1。第二次输出,访问到了早已定义的全局变量i,并改写值,第二次为2。第三次输出,内部定义了一个同名的变量, 它并没有返回值或者被该次执行程序以外任何程序读取a值,所以第三次输出仍然是a。第四次输出,定义了一个静态的局部变量,静态局部变量在函数调用结束后仍然存在,及它的内存空间不会被释放,但其他函数是不能引用它的,所以,两个静态变量虽然同名,但是并不是一样的东西,为2。答案是B

发表于 2023-05-09 13:49:28 回复(0)
执行f3后,在f3函数内部定义了一个静态变量,但是这个静态变量只能被f3调用,不能被主函数或者其他函数调用,所以最后输出的还是之前的f2调用的后的2
发表于 2022-10-28 21:19:44 回复(0)
在函数中定义的  int a,函数结束也就结束了,     而不加类型的a可以改变全局变量
发表于 2022-09-27 09:47:53 回复(0)
静态局部变量的生命周期为整个程序,但是仍然只会在函数内部被调用
发表于 2022-09-10 12:10:05 回复(0)
func1中没有定义a;所以func1中的a是函数外部定义的全局变量,此时a被重新赋值为2;而func2和func3中都重新定义了a,对于func2中的a,此处的a是局部变量,只在本函数体内有效,函数完成后直接销毁。func3中的a为静态变量(只分配一次内存),虽然函数完成后a不会销毁,但也只在函数内部才会生效,所以main函数中打印的都是全局变量a
发表于 2022-08-27 15:44:44 回复(0)