C语言中静态局部变量的问题 C语言静态局部变量初始化问题

C\u8bed\u8a00\u9759\u6001\u5c40\u90e8\u53d8\u91cf\u548c\u5168\u5c40\u53d8\u91cf\u6709\u4ec0\u4e48\u533a\u522b\uff0c\u4e0d\u90fd\u662f\u5728\u6574\u4e2a\u7a0b\u5e8f\u4e2d\u90fd\u6709\u6548\u5417\u3002\u5e0c\u671b\u80fd\u4e3e\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\uff0c\u8c22\u8c22\u5566

\u6309\u5b58\u50a8\u533a\u57df\u5206\uff1a\u5168\u5c40\u53d8\u91cf\u3001\u9759\u6001\u5168\u5c40\u53d8\u91cf\u548c\u9759\u6001\u5c40\u90e8\u53d8\u91cf\u90fd\u5b58\u653e\u5728\u5185\u5b58\u7684\u5168\u5c40\u6570\u636e\u533a\uff0c\u5c40\u90e8\u53d8\u91cf\u5b58\u653e\u5728\u5185\u5b58\u7684\u6808\u533a
\u6309\u4f5c\u7528\u57df\u5206\uff1a\u5168\u5c40\u53d8\u91cf\u5728\u6574\u4e2a\u5de5\u7a0b\u6587\u4ef6\u5185\u90fd\u6709\u6548\uff1b\u9759\u6001\u5168\u5c40\u53d8\u91cf\u53ea\u5728\u5b9a\u4e49\u5b83\u7684\u6587\u4ef6\u5185\u6709\u6548\uff1b\u9759\u6001\u5c40\u90e8\u53d8\u91cf\u53ea\u5728\u5b9a\u4e49\u5b83\u7684\u51fd\u6570\u5185\u6709\u6548\uff0c\u53ea\u662f\u7a0b\u5e8f\u4ec5\u5206\u914d\u4e00\u6b21\u5185\u5b58\uff0c\u51fd\u6570\u8fd4\u56de\u540e\uff0c\u8be5\u53d8\u91cf\u4e0d\u4f1a\u6d88\u5931\uff1b\u5c40\u90e8\u53d8\u91cf\u5728\u5b9a\u4e49\u5b83\u7684\u51fd\u6570\u5185\u6709\u6548\uff0c\u4f46\u662f\u51fd\u6570\u8fd4\u56de\u540e\u5931\u6548\u3002
\u5168\u5c40\u53d8\u91cf\u548c\u9759\u6001\u53d8\u91cf\u5982\u679c\u6ca1\u6709\u624b\u5de5\u521d\u59cb\u5316\uff0c\u5219\u7531\u7f16\u8bd1\u5668\u521d\u59cb\u5316\u4e3a0\u3002\u5c40\u90e8\u53d8\u91cf\u7684\u503c\u4e0d\u53ef\u77e5\u3002
\u4ee3\u7801\u5982\u4e0b\uff1a
//test.cpp
#include
extern int a;//\u53d8\u91cf\u58f0\u660e\uff0c\u4e0d\u662f\u5b9a\u4e49
static int b=5;
void func1()
{
cout < <b < <endl < <a < <endl;//\u7ed3\u679c\u4e3a5
}

//main.cpp
int a;
int b=10;
void func2()
{
static int i;
i++;
cout < <i < <endl;
}

void func1();

void main()
{
a=20;
func1();
func2();
func2();
}
\u8f93\u51fa\u7ed3\u679c\u4e3a
5
20
1
2

\u8fd9\u4e0e\u7f16\u8bd1\u5668\u7684\u5904\u7406\u65b9\u6cd5\u6709\u5173\u3002
\u9759\u6001\u53d8\u91cf\u751f\u547d\u671f\u4e0e\u7a0b\u5e8f\u76f8\u540c\uff0c\u672a\u8c03\u7528\u51fd\u6570\u524d\uff0c\u5185\u5b58\u5206\u914d\u5df2\u5b8c\u6210\u3002\u662f\u5426\u540c\u65f6\u4e5f\u8d4b\u4e86\u503c\uff0c\u4e0d\u80fd\u80af\u5b9a\u3002\u53ef\u80fd\u5728\u7b2c\u4e00\u6b21\u8c03\u7528\u65f6\u8d4b\u503c\uff0c\u4e5f\u53ef\u4ee5\u5728\u5f00\u8f9f\u5185\u5b58\u7684\u65f6\u5019\u5c31\u5df2\u7ecf\u8d4b\u4e86\u503c\u3002
\u4ece\u7a0b\u5e8f\u8bbe\u8ba1\u8003\u8651\uff0c\u5047\u5b9a\u5185\u5b58\u5206\u914d\u65f6\u5c1a\u672a\u5b8c\u6210\u8d4b\u503c\uff0c\u4ee5\u514d\u526f\u4f5c\u7528\u3002

静态局部变量相当于全局变量(只是只有在这个函数中能访问,但是生命周期是和全局变量差不多的),函数退出之后变量还在,而且只在第一次进入的时候做初始化,以后会跳过初始化语句,保留原来的值(也就是说,如果item是static的,那么只有在第一次进入这个函数的时候会执行item=0,以后都不会执行。)。

因为static的生命周期是要等到整个程序运行完才释放的,而且当他被赋值一次时,在定义的地方是不会再重新给他赋值的。。。所以当你输入的第一次88 88 88 55 有一个小于60 时 item 就被赋值为1了,之后不管你输入的是88 88 88 88 还是 99 99 99 99 之类的。。他都是 1 。
修改的方法是用以下的方法让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 循环的外面,不然这句会出错

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声明的变量分配的地址不是在栈中。在完成第一次调用后,它仍然存在,并且有个值。第二次调用时,并不会再重新生成一个变量,还会使用上一次函数完成时的值。

静态局部变量相当于全局变量,只是只有在这个函数中能访问,但是生命周期是和全局变量差不多的,函数退出之后变量还在,而且只在第一次进入的时候做初始化,以后会跳过初始化语句,保留原来的值。

在函数内部static声明的变量,在第一次调用函数的时候进行初始化,此后对此函数的调用,都使用第一次初始化话时的变量,对函数内部来说就像是使用全局变量一样,但静态局部变量只对声明的函数可见。一般编写底层应用的时候用的比较多

  • C璇█涓潤鎬佸眬閮ㄥ彉閲忕殑闂
    绛旓細闈欐佸眬閮ㄥ彉閲忕浉褰撲簬鍏ㄥ眬鍙橀噺锛堝彧鏄彧鏈夊湪杩欎釜鍑芥暟涓兘璁块棶锛屼絾鏄敓鍛藉懆鏈熸槸鍜屽叏灞鍙橀噺宸笉澶氱殑锛夛紝鍑芥暟閫鍑轰箣鍚庡彉閲忚繕鍦紝鑰屼笖鍙湪绗竴娆¤繘鍏ョ殑鏃跺欏仛鍒濆鍖栵紝浠ュ悗浼氳烦杩囧垵濮嬪寲璇彞锛屼繚鐣欏師鏉ョ殑鍊硷紙涔熷氨鏄锛屽鏋渋tem鏄痵tatic鐨勶紝閭d箞鍙湁鍦ㄧ涓娆¤繘鍏ヨ繖涓嚱鏁扮殑鏃跺欎細鎵цitem=0锛屼互鍚庨兘涓嶄細鎵ц銆傦級銆
  • C璇█闈欐佸彉閲忛棶棰?
    绛旓細static鍙橀噺 static澹版槑鐨勫彉閲忎负鈥闈欐佸眬閮ㄥ彉閲鈥濓紝鍙橀噺鍐呭鍏锋湁鎸佷箙鎬с傝灞閮ㄥ彉閲忕殑鍊煎湪鍑芥暟璋冪敤缁撴潫涔嬪悗涓嶄細娑堝け锛岃屼粛鐒朵繚鐣欏叾鍘熷笺傚嵆瀹冩墍鍗犵敤鐨勫瓨鍌ㄥ崟鍏冧笉閲婃斁锛屽湪涓嬩竴娆¤皟鐢ㄨ鍑芥暟鏃讹紝鍏跺眬閮ㄥ彉閲忕殑鍊间粛鐒跺瓨鍦紝涔熷氨鏄笂涓娆″嚱鏁拌皟鐢ㄧ粨鏉熸椂鐨勫笺俽eturn m++ 鍓嶇疆++鏄敤涔嬪墠灏卞姞1锛岀敤鐨勪汉鎷垮埌鐨勪竴瀹...
  • c璇█涓:闈欐佸眬閮ㄥ彉閲鍙兘琚祴鍊间竴娆,闈欐佸閮ㄥ彉閲忎笌澶栭儴鍙橀噺鑳借璧嬪煎...
    绛旓細閿欑殑锛屽彉閲忔槸鍙互淇敼鐨勶紝甯搁噺涓嶅彲浠 闈欐佸眬閮ㄥ彉閲鍜岄潤鎬佸閮ㄥ彉閲忔槸涓鏍风殑锛屽樊鍒氨鏄竴涓眬閮ㄤ竴涓叏灞锛屽彧鏄痵tatic鍙堜笉鏄痗onst
  • c++闈欐佸眬閮ㄥ彉閲鍜岄潤鎬佸嚱鏁
    绛旓細闈欐佸眬閮ㄥ彉閲忔濂藉彲浠ヨВ鍐宠繖涓棶棰樸闈欐佸眬閮ㄥ彉閲忎繚瀛樺湪鍏ㄥ眬鏁版嵁鍖猴紝鑰屼笉鏄繚瀛樺湪鏍堜腑锛屾瘡娆$殑鍊间繚鎸佸埌涓嬩竴娆¤皟鐢紝鐩村埌涓嬫璧嬫柊鍊銆傝鍙橀噺鍦ㄥ叏灞鏁版嵁鍖哄唴鍒嗛厤鍐呭瓨锛涢潤鎬佸眬閮ㄥ彉閲忓湪绋嬪簭鎵ц鍒拌瀵硅薄鐨勫0鏄庡鏃惰棣栨鍒濆鍖栵紝鍗充互鍚庣殑鍑芥暟璋冪敤涓嶅啀杩涜鍒濆鍖栵紙杩欎竴鐐归潪甯哥殑閲嶈锛夛紱闈欐佸眬閮ㄥ彉閲忎竴鑸湪澹版槑澶...
  • c璇█涓,闈欐佸眬閮ㄥ彉閲鍜岄潤鎬佸叏灞鍙橀噺鐨鍊,鍦ㄥ嚱鏁拌皟鐢ㄧ粨鏉熷悗閮戒繚鐣欏師鍊煎悧...
    绛旓細鏈垵濮嬪寲鐨勯潤鎬佸眬閮ㄥ彉閲瀛樻斁BSS娈典腑锛屽垵濮嬪寲浜嗙殑闈欐佸眬閮ㄥ彉閲忓瓨鏀句簬鍏ㄥ眬鍖猴紝闈欐佸叏灞鍙橀噺瀛樻斁浜庡叏灞鍖猴紝锛屽嚱鏁拌皟鐢ㄥ畬浜嗭紝閲婃斁鑷繁浣跨敤鐨勬爤鍐呭瓨銆傚鏋滃嚱鏁颁腑鏈夋敼鍙樺叏灞鍖烘垨BSS娈电殑鍙橀噺锛屽嚱鏁拌皟鐢ㄥ畬鍚庯紝杩欎簺鍙橀噺鐨鍊煎氨鏄嚱鏁伴噷淇敼鍚庣殑鍊笺
  • C璇█闈欐佸眬閮ㄥ彉閲鍜屽叏灞鍙橀噺鏈変粈涔堝尯鍒,涓嶉兘鏄湪鏁翠釜绋嬪簭涓兘鏈夋晥鍚...
    绛旓細鍏ㄥ眬鍙橀噺鍜闈欐佸彉閲濡傛灉娌℃湁鎵嬪伐鍒濆鍖栵紝鍒欑敱缂栬瘧鍣ㄥ垵濮嬪寲涓0銆灞閮ㄥ彉閲忕殑鍊间笉鍙煡銆備唬鐮佸涓嬶細//test.cpp include <iostream.h> extern int a;//鍙橀噺澹版槑锛屼笉鏄畾涔 static int b=5;void func1(){ cout < <b < <endl < <a < <endl;//缁撴灉涓5 } //main.cpp int ...
  • c++闈欐佸眬閮ㄥ彉閲鍒濆鍖闂
    绛旓細C++璇█涓锛岄潤鎬佸眬閮ㄥ彉閲忥紝鏄寚瀹氫箟鍦ㄥ嚱鏁板唴閮紝鍏锋湁static淇グ鐨勫彉閲忋傚叾瀹氫箟褰㈠紡涓 static type var = init_value;鎴 static type var(init_value);鍏跺惈涔変负锛屽畾涔変竴涓被鍨嬩负type,鍚嶇О涓簐ar鐨勯潤鎬佸眬閮ㄥ彉閲锛屽苟鍒濆鍊间负init_value銆傚叾涓=init_value,鎴(init_value)涓哄垵濮嬪寲閮ㄥ垎锛屽彲浠ョ渷鐣ャ傚綋鐪佺暐鏃...
  • C璇█:鍚勫嚱鏁板唴閮ㄥ畾涔鐨勯潤鎬佸眬閮ㄥ彉閲鍙惁鍚屽悕
    绛旓細闈欐佸彉閲涓鏃﹁瀹氫箟锛屽唴瀛樹腑鍒嗛厤缁欒鍙橀噺鐨绌洪棿涓嶄細琚噴鏀撅紝鐩村埌鎺夌數銆備絾杩欏拰鍙橀噺鍚嶇浉鍚屼笌鍚︽槸涓や釜姒傚康锛屽彉閲忓悕鍙槸鍐呭瓨绌洪棿鐨勪竴涓悕绉版垨鑰呮寚绀烘寚閽堣屽凡銆傚鏋滀袱涓悓鍚鐨勯潤鎬鍙橀噺鍦ㄤ袱涓笉鍚岀殑鍑芥暟鍐呴儴琚畾涔夛紝鍐呭瓨鍒嗛厤鏃跺湴鍧鎸囬拡骞朵笉鍚岋紝鎵鏈変笉浼氬啿绐併傚嚱鏁板唴閮ㄥ畾涔夌殑闈欐佸彉閲忓湪搴旂敤鏃堕渶瑕佹敞鎰忎竴涓闂锛...
  • C璇█:鍚勫嚱鏁板唴閮ㄥ畾涔鐨勯潤鎬佸眬閮ㄥ彉閲鍙惁鍚屽悕?
    绛旓細鍙互銆併闈欐佸眬閮ㄥ彉閲鍦ㄥ嚱鏁拌皟鐢ㄧ粨鏉熷悗浠嶇劧瀛樺湪锛屽強瀹冪殑鍐呭瓨绌洪棿涓嶄細琚噴鏀撅紝浣嗗叾浠栧嚱鏁版槸涓嶈兘寮曠敤瀹冪殑銆傚洜涓哄畠鏄眬閮ㄥ彉閲忥紝鍙兘琚湰鍑芥暟寮曠敤锛岃屼笉鑳借鍏朵粬鍑芥暟寮曠敤銆傛墍浠ヤ綘鍦ㄥ叾浠栧嚱鏁颁腑鍛藉悕涓涓悓鍚嶇殑鍙橀噺鏄笉鍐茬獊鐨勩併
  • 鑿滈笩姹傛暀C璇█闈欐佸眬閮ㄥ彉閲
    绛旓細鍗硈=18 绗笁娆″惊鐜痠=2 int f(int n) {static int a=3; int t=0; if(n%2) //鏉′欢涓嶆垚绔 {static int a=4;t+=a++;} else (static int a=5;t+=a++;} //t=6; a 绗竴娆″惊鐜椂鏇存敼 return t+a++; //return 6+5 } 缁撴灉s=s+11,鍗硈=18+1...
  • 扩展阅读:扫一扫题目出答案 ... 静态局部变量不正确 ... 静态局部变量的生存期 ... 静态局部变量考点 ... c静态局部变量的特点 ... c语言静态变量有哪些 ... c语言静态变量的例子 ... 静态局部变量在哪个段 ... c语言静态局部变量是什么 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网