東營建筑信息網(wǎng)北京網(wǎng)絡(luò)seo經(jīng)理
目錄
1、(作用)域的概念
2、全局與局部的相對(duì)性
3、生命周期
3、靜態(tài)變量static
結(jié)語:
前言:
????????在c語言中,全局變量的可見范圍是整個(gè)工程,而局部變量的可見范圍從該變量被定義到該作用域結(jié)束,在一個(gè)變量的可見范圍外是調(diào)用不了該變量的,換句話說在一個(gè)變量的可見范圍內(nèi)不能定義一個(gè)和該變量同名的變量,而在該變量的可見范圍外可以定義一個(gè)與該變量名字一樣的變量。
? ? ? ? 全局變量的生命周期是整個(gè)程序的生命周期,而局部變量的生命周期是從該變量在他的作用域中被定義開始,直到出了該作用域就結(jié)束,結(jié)束意味著該局部變量以及他的值會(huì)被系統(tǒng)銷毀。
1、(作用)域的概念
? ? ? ? 首先再了解全局變量和局部變量前,最重要的是了解什么是作用域,通常用一對(duì)大括號(hào)”{}“括起來的區(qū)域就是一個(gè)作用域,而在該作用域創(chuàng)建的變量為局部變量,重要的是作用域與作用域之間是互不干擾的,是相對(duì)獨(dú)立的兩塊區(qū)域。
? ? ? ? 比如最常見的main函數(shù)就是用一個(gè)大括號(hào)括起來的:
#include<stdio.h>int main()
{//左大括號(hào)//main函數(shù)的作用域//...int a = 12;//a為局部變量return 0;
}//右大括號(hào)
? ? ? ? 不僅僅只有函數(shù)是用大括號(hào)進(jìn)行規(guī)劃的,if語句和while循環(huán)、fot循環(huán)等等都是用大括號(hào)”{}“進(jìn)行規(guī)劃作用域的,因此在這些大括號(hào)中創(chuàng)建的變量也可以稱為局部變量,且相互獨(dú)立。
? ? ? ? 例子如下:
#include<stdio.h>int main()
{int a = 12;if (1){int a = 20;}for (int a = 1; a > 0; a--){}while (a--){int a = 100;}printf("hello world");return 0;
}
? ? ? ? 以上代碼雖然在同一個(gè)main函數(shù)內(nèi)定義了4個(gè)a變量,但是是在不同的作用域中都有的,因此最后可以正常打印出了hello world,說明該程序沒有問題。
? ? ? ? 函數(shù)區(qū)分作用域的例子如下:
#include<stdio.h>void func()
{int a = 20;
}int main()
{int a = 12;func();printf("hello world");return 0;
}
? ? ? ? 最后依舊能夠打印出hello world,表示該程序沒有問題。
2、全局與局部的相對(duì)性
? ? ? ? 全局變量和局部變量是具有相對(duì)性的,比如一個(gè)局部變量a,他相對(duì)于他作用域外是局部的,但是他相對(duì)于他的作用域里面的某個(gè)作用域是全局的。
? ? ? ? 示例代碼如下:
#include<stdio.h>int main()
{int a = 12;//相對(duì)于if語句里的作用域,該a是全局變量if (1){printf("%d ", a);//可以打印出a的值}return 0;
}
? ? ? ? 運(yùn)行結(jié)果:
? ? ? ? ?若一個(gè)作用域和該域之外的作用域都有一個(gè)同名變量a,若想在該作用域中打印該變量的值,則打印的是局部變量的值,遵循局部?jī)?yōu)先的法則。
?????????示例代碼如下:
#include<stdio.h>int a = 1020;//全局變量int main()
{printf("%d\n", a);//由于局部變量的可見范圍是在其創(chuàng)建時(shí)才開始,因此這里打印的是1020int a = 12;//局部?jī)?yōu)先printf("%d\n", a);if (1){printf("%d\n", a);//由于局部變量的可見范圍是在其創(chuàng)建時(shí)才開始,因此這里打印的是12int a = 20;//局部?jī)?yōu)先printf("%d\n", a);}return 0;
}
? ? ? ? 運(yùn)行結(jié)果:
3、生命周期
? ? ? ? 一個(gè)變量出了其作用域就會(huì)被銷毀,表示其生命周期結(jié)束了,生命周期通常是用函數(shù)中的局部變量來做解釋,因?yàn)橐粋€(gè)函數(shù)被調(diào)用完成后會(huì)被銷毀,其函數(shù)中的局部變量也就跟著銷毀了。
? ? ? ? 示例代碼如下:
#include<stdio.h>void func()
{int a = 2;//出了函數(shù),變量a就被銷毀
}int main()
{func();printf("%d ", a);//此處會(huì)找不到變量aif (1){int a = 12;//出了作用域,也可以理解為變量a被銷毀}printf("%d ", a);//此處也會(huì)找不到變量areturn 0;
}
3、靜態(tài)變量static
? ? ? ? static的作用是延長局部變量的生命周期,但是不會(huì)延長其可見范圍,也就是某個(gè)作用域中的變量加了static后,下一次來到該作用域時(shí),該變量不會(huì)再次被初始化,而是接著用之前的值,但是在該變量作用域外的作用域依然無法調(diào)用他。
? ? ? ? 示例代碼如下:
#include<stdio.h>void func()
{static int a = 2;//只會(huì)初始化一次a,后續(xù)就跳過初始化的步驟a++;printf("%d ", a);
}int main()
{func();func();func();//printf("%d ", a);//此處依然找不到areturn 0;
}
? ? ? ? 運(yùn)行結(jié)果:
? ? ? ? 沒加static的運(yùn)行結(jié)果:?
? ? ? ? 從結(jié)果可以看到,如果沒有加static,那么局部變量a在調(diào)用完函數(shù)func后就跟著銷毀了,則下一次調(diào)用函數(shù)func時(shí),a又會(huì)重新初始化。如果加了static,a只會(huì)初始化一次,并且不會(huì)跟著函數(shù)一起銷毀,后續(xù)調(diào)用函數(shù)func時(shí),a會(huì)保留之前的值進(jìn)入該函數(shù)。
結(jié)語:
? ? ? ? 全局變量和局部變量作為c語言中的基礎(chǔ),其雖然看起來不起眼,但是對(duì)今后的學(xué)習(xí)都是非常重要的一環(huán)知識(shí),最后希望本文可以給你帶來更多的收獲,如果本文對(duì)你起到了幫助,希望可以動(dòng)動(dòng)小指頭幫忙點(diǎn)贊👍+關(guān)注😎+收藏👌!如果有遺漏或者有誤的地方歡迎大家在評(píng)論區(qū)補(bǔ)充~!!謝謝大家!!( ̄︶ ̄)↗