C语言中静态局部变量的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中静态局部变量的问题相关的知识,希望对你有一定的参考价值。
#include<stdio.h>
int main()
int t,n,i,str[4];
scanf("%d",&t);
while(t--)
scanf("%d",&n);
int sum=0;
while(n--)
int item=0;
scanf("%d%d%d%d",&str[1],&str[2],&str[3],&str[4]);
if(str[1]<60||str[2]<60||str[3]<60||str[4]<60)
item=1;
sum+=item;
printf("%d\n",sum);
return 0;
将其中的item的定义改为static int item;然后输入几组数据后 累加就会出错(多加了)
例如输入1(回车)4(回车)88 88 88 55(回车)88 88 88 59(回车)88 88 88 88(回车)88 55 88 88(回车) 到这里就会输出一个值 没有用static定义的输出的值是3 用static定义的输出的值是4 求解释喔
修改的方法是用以下的方法让item重新赋值(如下):
static int item;
item = 0 ;
又或者可以不用sum
直接写成:
if(str[1]<60||str[2]<60||str[3]<60||str[4]<60)
item++;
printf("%d\n",item); // 注意:要把static int item 写到while 循环的外面,不然这句会出错 参考技术B static 用修饰符来声明的变量叫静态变量。
这种变量和一般的变量不同。从程序开始到程序结束一直存在。
局部静态变量。是在函数内部声明的静态变量。
局部静态变量的值有一个特性,它会保存你操作的结果。
举个例子:
int test(int a)
static int sum = 5;
sum += a;
return sum;
当你第一次调用时 static int sum = 5;起作用
int a1 = test(2);// a1 = 7 同时 sum = 7
当你第二次调用时 static int sum = 5;不起作用 sum = 7
int a2 = test(2);// a2 = 9 sum = 9
这是因为用static声明的变量分配的地址不是在栈中。在完成第一次调用后,它仍然存在,并且有个值。第二次调用时,并不会再重新生成一个变量,还会使用上一次函数完成时的值。 参考技术C 静态局部变量相当于全局变量,只是只有在这个函数中能访问,但是生命周期是和全局变量差不多的,函数退出之后变量还在,而且只在第一次进入的时候做初始化,以后会跳过初始化语句,保留原来的值。 参考技术D 在函数内部static声明的变量,在第一次调用函数的时候进行初始化,此后对此函数的调用,都使用第一次初始化话时的变量,对函数内部来说就像是使用全局变量一样,但静态局部变量只对声明的函数可见。一般编写底层应用的时候用的比较多
C语言中static是做啥用的?
看网上说法不一。如果是为程序中的通用变量定义的话(就像VB中的Public一样)。那指针不是也可以么?还有。在main()之外定义变量不是也可以整个程序通用么?
有两种用法:
1、static修饰局部变量,成为一个局部静态变量。
static修饰局部变量(静态局部变量)与普通局部变量相比,它的优势在于:
①静态局部变量作用域与连接属性与普通局部变量一样;
②存储类:静态局部变量分配在data/bss段,普通局部变量在栈上;
③生命周期:因为存储类的不同,静态局部变量的生命周期得到延长了,直到程序结束。
2、static修饰全局变量与函数,成为静态全局变量与静态函数。
static修饰全局变量\\函数 与 普通全局变量\\普通函数相比,它的优势在于:
①存储类、生命周期、作用域都一样;
②差别在于static修饰全局变量\\函数连接属性是内连接,普通全局变量\\普通函数是外链接;
③就是说static修饰全局变量\\函数不能跨文件访问调用。
扩展资料:
在类内数据成员的声明前加上static关键字,该数据成员就是类内的静态数据成员。其特点如下:
静态数据成员存储在全局数据区,静态数据成员在定义时分配存储空间,所以不能在类声明中定义
静态数据成员是类的成员,无论定义了多少个类的对象,静态数据成员的拷贝只有一个,且对该类的所有对象可见。也就是说任一对象都可以对静态数据成员进行操作。而对于非静态数据成员,每个对象都有自己的一份拷贝。
由于上面的原因,静态数据成员不属于任何对象,在没有类的实例时其作用域就可见,在没有任何对象时,就可以进行操作
和普通数据成员一样,静态数据成员也遵从public, protected, private访问规则
静态数据成员的初始化格式:<数据类型><类名>::<静态数据成员名>=<值>
类的静态数据成员有两种访问方式:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
C语言中static具有静态存储持续时间、块范围和无链接。即作用域只能在块中,无法被块外的程序调用;变量在程序加载时创建,在程序终止时结束。
它只在编译时初始化一次。如果没有显式初始化,默认初始化为0。变量stay ,它从程序加载时开始存在,直到程序终止。但是它的范围仅限于trystat() 函数块。只有当这个函数执行时,程序才能使用stay 访问它指定的对象。
静态变量在程序加载到内存之后就已经就位了。将语句static int stay = 1; 放在trystat()函数中告诉编译器,只允许trystat() 函数查看变量;它不是在运行时执行的语句。
扩展资料
在任何函数外部使用static修饰变量,它具有静态存储时间、文件范围和内部链接。
即作用域在当前文件之中(只能被同一文件中的函数使用),无法被其他文件调用。它只在编译时初始化一次。如果没有显式初始化,默认初始化为0。
使用static修饰函数,作用域限制在当前定义的文件中使用,从而避免了多文件函数名称冲突的可能性。通常文件中不作为接口的函数,建议使用static修饰,这样避免不同文件使用相同的函数名发生冲突。
参考技术B在C语言中,static关键字的功能如下:
1,修改变量时,static修饰的静态局部变量只执行一次,局部变量的生命周期延长,直到程序运行结束才释放。
2,当static修改全局变量时,全局变量只能在该文件中访问,而不能在其他文件中访问,甚至在外部声明中也不能访问。
3,static修饰函数,则此函数只能在此文件中调用,不能由其他文件调用,并且static修饰的局部变量存储在全局数据区域的静态变量区域中。
扩展资料:
static关键字在C语言、C++、Java中的作用是相似的,但也有区别:
1、C++的static用法:
面向过程的静态编程和面向对象的静态编程,前者适用于普通变量和函数,不涉及类,后者主要解释静态在类中的作用。然后在类中,static可用于修饰静态数据成员和静态成员方法
2、Java的static用法:
声明为静态的变量称为静态变量或类变量,静态变量可以通过类名或实例名直接引用,但前者更好,因为后者容易将静态变量与常规变量混淆。
声明为静态的方法称为静态方法或类方法,静态方法可以直接调用静态方法和访问静态变量,但不能直接访问实例变量和实例方法,此关键字不能在静态方法中使用,因为静态方法不属于任何实例。
参考资料来源:百度百科--static
为定义一个内部函数。
当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,为内部函数。
定义一个内部函数,只需在函数类型前再加一个“static”关键字即可,static 函数类型 函数名(函数参数表)……,其对函数的作用域仅局限于本文件。不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
扩展资料:
C语言的相关要求规定:
1、在主调函数中调用某函数之前应对该被调函数进行说明(声明),这与使用变量之前要先进行变量说明是一样的。
2、在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。
3、C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。
参考资料来源:百度百科-static
参考技术Dstatic 用来说明静态变量。如果是在函数外面定义的,那么其效果和全局变量类似,但是,static定义的变量只能在当前c程序文件中使用,在另一个c代码里面,即使使用extern关键词也不能访问这个static变量。如果是在函数内部定义的,那么这个变量只初始化一次。
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
C语言继续发展,在1982年,很多有识之士和美国国家标准协会为了使这个语言健康地发展下去,决定成立C标准委员会,建立C语言的标准。委员会由硬件厂商,编译器及其他软件工具生产商,软件设计师,顾问,学术界人士,C语言作者和应用程序员组成。
以上是关于C语言中静态局部变量的问题的主要内容,如果未能解决你的问题,请参考以下文章