- C語言入門很輕松(微課超值版)
- 云尚科技編著
- 3056字
- 2022-07-29 14:43:38
3.3 使用變量
變量是指在程序運(yùn)行過程中其值可以改變的量。在程序定義變量時(shí),編譯系統(tǒng)就會(huì)給它分配相應(yīng)的存儲(chǔ)單元,用來存儲(chǔ)數(shù)據(jù),變量的名稱就是該存儲(chǔ)單元的符號(hào)地址。
3.3.1 認(rèn)識(shí)變量
在C語言程序設(shè)計(jì)中,變量用于存儲(chǔ)程序中可以改變的數(shù)據(jù)。形象地講,變量就像一個(gè)存放東西的抽屜,知道了抽屜的名字(變量名),也就能找到抽屜的位置(變量的存儲(chǔ)單元)以及抽屜里的東西(變量的值)。當(dāng)然,抽屜里存放的東西是可以改變的,也就是說,變量值也是可以變化的。
從上面的敘述不難看出,變量具有4個(gè)基本屬性。具體介紹如下:
(1)變量名:一個(gè)符合規(guī)則的標(biāo)識(shí)符。
(2)變量類型:C語言中的數(shù)據(jù)類型或者是自定義的數(shù)據(jù)類型。
(3)變量位置:數(shù)據(jù)的存儲(chǔ)空間位置。
(4)變量值:數(shù)據(jù)存儲(chǔ)空間內(nèi)存放的值。
程序編譯時(shí),會(huì)給每個(gè)變量分配存儲(chǔ)空間和位置,程序讀取數(shù)據(jù)的過程,其實(shí)就是根據(jù)變量名查找內(nèi)存中相應(yīng)的存儲(chǔ)空間,從其內(nèi)取值的過程。
【例3.7】編寫程序,使用變量輸出偶數(shù)2和4,然后再輸出大寫字母A和B(源代碼\ch03\3.7.txt)。
圖3-7 例3.7的程序運(yùn)行結(jié)果
程序運(yùn)行結(jié)果如圖3-7所示。從輸出結(jié)果可以看出,變量i和y兩次輸出的值不一樣。
在本實(shí)例代碼中變量i和y是先進(jìn)行定義的,而且變量i和y都進(jìn)行了兩次賦值,可見,變量在程序運(yùn)行中是可以改變它的值的。例3.7代碼中的第5行和第7行是給變量賦初值的兩種方式,是變量的初始化。
☆大牛提醒☆
變量的名稱可以由字母、數(shù)字和下畫線字符組成,它必須以字母或下畫線開頭,大寫字母和小寫字母是不同的,因?yàn)镃語言是區(qū)分字母的大小寫的。
3.3.2 變量的聲明
變量聲明的作用是向編譯器保證變量以指定的類型和名稱存在,這樣編譯器在不需要知道變量完整細(xì)節(jié)的情況下也能繼續(xù)進(jìn)一步的編譯。變量的聲明有兩種情況:
(1)一種是需要建立存儲(chǔ)空間的。例如:int a在聲明的時(shí)候就已經(jīng)建立了存儲(chǔ)空間。
(2)另一種是不需要建立存儲(chǔ)空間的,通過使用extern關(guān)鍵字聲明變量名而不定義它。例如:extern int a,其中變量a可以在別的文件中定義的。
變量的聲明包括變量類型和變量名兩個(gè)部分,其語法格式如下:
變量類型 變量名
int num;double area;char c等語句都是變量的聲明,在這些語句中,int、double和char是變量類型,num、area和c是變量名。這里的變量類型也是數(shù)據(jù)類型的一種,即變量num是整型,area是雙精度浮點(diǎn)型,c是字符型。
變量類型是C語言自帶的數(shù)據(jù)類型和用戶自定義的數(shù)據(jù)類型。C語言自帶的數(shù)據(jù)類型包括整型、字符型、浮點(diǎn)型、枚舉型和指針類型等。
【例3.8】編寫程序,在程序首部聲明變量,從而計(jì)算兩數(shù)之和,這里變量的定義與初始化在主函數(shù)內(nèi)(源代碼\ch03\3.8.txt)。
圖3-8 例3.8的程序運(yùn)行結(jié)果
程序運(yùn)行結(jié)果如圖3-8所示。從輸出結(jié)果可以看出,變量x和y相加之后的值為“211”。
變量名其實(shí)就是一個(gè)標(biāo)識(shí)符,當(dāng)然,標(biāo)識(shí)符的命名規(guī)則在此處同樣適用。因此,變量命名時(shí)需要注意以下幾點(diǎn):
· 命名時(shí)應(yīng)注意區(qū)分大小寫,并且盡量避免使用大小寫上有區(qū)別的變量名。
· 不建議使用以下畫線開頭的變量名,因?yàn)榇祟惷Q通常是保留給內(nèi)部和系統(tǒng)的名字。
· 不能使用C語言保留字或預(yù)定義標(biāo)識(shí)符作為變量名。如int、define等。
· 避免使用類似的變量名。如total、totals、total1等。
· 變量的命名最好具有一定的實(shí)際意義。如sum一般表示求和,area一般表示面積。
· 變量的命名需放在變量使用之前。
☆大牛提醒☆
如果變量沒有經(jīng)過聲明而直接使用,則會(huì)出現(xiàn)編譯器報(bào)錯(cuò)的現(xiàn)象。
3.3.3 變量的賦值
既然變量的值可以在程序中隨時(shí)改變,那么,變量必然可以多次賦值。變量除了通過賦值的方式獲得值外,還可以通過初始化的方式獲得值。把第一次的賦值行為稱為變量的初始化。也可以這么說,變量的初始化是賦值的特殊形式。
下面給出幾個(gè)變量賦值的語句:
int i;
double f;
char a;
i=10;
f=3.4;
a=’b’;
在這個(gè)語句中,前3行是變量的定義,后3行是對變量賦值。將10賦給了整型的變量i,3.4賦給了雙精度浮點(diǎn)型的變量f,字符b賦給了字符型的變量a。后3行都是使用的賦值表達(dá)式。
從上述語句不難得出,對變量賦值的語法格式如下:
變量名=變量值;
對變量的初始化格式如下:
變量類型 變量名=初始值;
其中,變量必須在賦值之前進(jìn)行定義。符號(hào)“=”稱為賦值運(yùn)算符,而不是等號(hào)。它表示將其后邊的值放入以變量名命名的變量中。變量值可以是一個(gè)常量或一個(gè)表達(dá)式。例如:
int i=5;
int j=i;
double f=2.5+1.8;
char a=’b’;
int x=y+2;
更進(jìn)一步,賦值語句不僅可以給一個(gè)變量賦值,還可以給多個(gè)變量賦值,格式如下:
變量類型 變量名1=初始值,變量名2=初始值...
例如:
int i=8,j=10,m=12;
上面的代碼分別給變量i賦了8,給變量j賦了10,給變量m賦了12,相當(dāng)于語句:
int i,j,m;
i=8;
j=10;
m=12;
☆大牛提醒☆
變量的定義是讓內(nèi)存給變量分配內(nèi)存空間,在分配好內(nèi)存空間后,程序沒有運(yùn)行前,變量會(huì)分配一個(gè)不可知的混亂值,如果程序中沒有對其進(jìn)行賦值就使用的話,勢必會(huì)引起不可預(yù)期的結(jié)果。所以,使用變量前務(wù)必要對其初始化,而且只有變量的數(shù)據(jù)類型相同時(shí),才可以在一個(gè)語句中進(jìn)行初始化。
【例3.9】編寫程序,通過給變量賦值,計(jì)算奇數(shù)3與5的和(源代碼\ch03\3.9.txt)。
程序運(yùn)行結(jié)果如圖3-9所示。
圖3-9 例3.9的程序運(yùn)行結(jié)果
3.3.4 變量的分類
變量按其作用域可分為局部變量和全局變量。全局變量在整個(gè)工程文件內(nèi)都有效,其中靜態(tài)全局變量只在定義它的文件內(nèi)有效;局部變量在定義它的函數(shù)內(nèi)有效,當(dāng)函數(shù)返回后失效,靜態(tài)局部變量只在定義它的函數(shù)內(nèi)有效,只是程序僅分配一次內(nèi)存,函數(shù)返回后,該變量不會(huì)消失,只有程序結(jié)束后才釋放內(nèi)存。
1.局部變量
局部變量也稱為內(nèi)部變量。局部變量是在函數(shù)內(nèi)作定義說明的。其作用域僅限于函數(shù)內(nèi),離開該函數(shù)后再使用這種變量是非法的。如下面的代碼段:
x,y作用域在函數(shù)fun內(nèi)定義了三個(gè)變量a、b、c。在fun的范圍內(nèi)a、b、c有效,或者說a、b、c變量的作用域限于fun內(nèi)。同理,x,y的作用域限于主函數(shù)main()內(nèi)。
☆大牛提醒☆
局部變量也只有局部作用域,它在程序運(yùn)行期間不是一直存在,而是只在函數(shù)執(zhí)行期間存在,函數(shù)的一次調(diào)用執(zhí)行結(jié)束后,變量被撤銷,其所占用的內(nèi)存也被收回。
2.全局變量
全局變量也稱為外部變量,它是在函數(shù)外部定義的變量。它不屬于哪一個(gè)函數(shù),而是屬于一個(gè)源程序文件,其作用域是整個(gè)源程序。在函數(shù)中使用全局變量,一般應(yīng)作全局變量說明,只有在函數(shù)內(nèi)經(jīng)過說明的全局變量才能使用。全局變量具有全局作用域,只需在一個(gè)源文件中定義,就可以作用于所有的源文件。當(dāng)然,其他不包含全局變量定義的源文件需要用extern關(guān)鍵字再次聲明這個(gè)全局變量。
例如下面的代碼段:
從上例可以看出a、b、c、d都是在函數(shù)外部定義的外部變量,都是全局變量。但c、d定義在函數(shù)fun1()之后,而函數(shù)fun1()內(nèi)又沒有對c、d加以說明,所以它們在函數(shù)fun1()內(nèi)無效。a、b定義在源程序最前面,因此在函數(shù)fun1()、函數(shù)fun2()及主函數(shù)main()內(nèi)不加說明也可使用。
【例3.10】編寫程序,使用全局變量定義長方體的長、寬、高,通過鍵盤輸入長方體的長、寬、高值,求出長方體的體積以及三個(gè)不同面的面積(源代碼\ch03\3.10.txt)。
程序運(yùn)行結(jié)果如圖3-10所示,根據(jù)提示輸入長、寬、高,按Enter鍵,即可計(jì)算出長方體的體積與三個(gè)不同面的面積,如圖3-11所示。
圖3-10 例3.10的程序運(yùn)行結(jié)果
圖3-11 計(jì)算長方體的體積與面積
該實(shí)例中定義了三個(gè)全局變量ar1,ar2,ar3,用來存放三個(gè)面積,其作用域?yàn)檎麄€(gè)程序。函數(shù)vol()用來求長方體的體積和三個(gè)面積,函數(shù)的返回值為體積v。由主函數(shù)完成長寬高的輸入及結(jié)果輸出。
☆大牛提醒☆
C語言規(guī)定函數(shù)返回值只有一個(gè),當(dāng)需要增加函數(shù)的返回?cái)?shù)據(jù)時(shí),用全局變量是一種很好的方式。本例中,如不使用全局變量,在主函數(shù)中就不可能取得v,ar1,ar2,ar3四個(gè)值。而采用了全局變量,在函數(shù)vol()中求得的ar1,ar2,ar3在主函數(shù)main()中仍然有效。因此全局變量是實(shí)現(xiàn)函數(shù)之間數(shù)據(jù)通信的有效手段。
- Java程序設(shè)計(jì)實(shí)戰(zhàn)教程
- Python自然語言處理實(shí)戰(zhàn):核心技術(shù)與算法
- Wireshark Network Security
- 數(shù)據(jù)結(jié)構(gòu)習(xí)題解析與實(shí)驗(yàn)指導(dǎo)
- Java系統(tǒng)化項(xiàng)目開發(fā)教程
- Multithreading in C# 5.0 Cookbook
- C語言程序設(shè)計(jì)簡明教程:Qt實(shí)戰(zhàn)
- OpenCV 3 Blueprints
- Mockito Essentials
- Practical GIS
- Modernizing Legacy Applications in PHP
- Java高級(jí)程序設(shè)計(jì)
- 你好!Python
- Tkinter GUI Programming by Example
- Python編程基礎(chǔ)與數(shù)據(jù)分析