謹記
當你感覺累的時候心赶,說明你還活著,當你突然感覺不到的累那一刻缺猛,也就意味著你已經(jīng)被社會淘汰了缨叫,人活著就的受累,因為:活著就是為了改變世界荔燎。
目標:學習C語言的變量耻姥、常量及作用域等
通過這篇文章,你將了解到C語言中有關常量有咨、變量琐簇、作用域等知識點,本篇文章將結合程序進行一個展示座享,當然也同樣希望讀者能自行舉一反三婉商。
常量
1.const定義常量
在C語言中,可以使用const來定義一個常量渣叛。只需在變量名前加上const即可丈秩。
int const a;
以上語句定義了a為一個整數(shù)常量。那么淳衙,既然a的值不能被修改癣籽,如何讓a擁有一個值呢?
這里滤祖,一般有兩種方法筷狼,其一是在定義時對它進行初始化,如下所示匠童。
int const a = 100;
其二埂材,在函數(shù)中聲明為const的形參在函數(shù)被調(diào)用時會得到實參的值。
在這里需要著重講解的是const涉及指針變量的情況汤求,先看兩個const定義俏险。
const int *a;
int * const a;
在第一條語句中严拒,const用來修飾指針a所指向的對象,也就是說我們無法通過指針a來修改其指向的對象的值竖独。但是a這個指針本身的值(地址)是可以改變的裤唠,即可以指向其他對象。與此相反莹痢,在第二條語句中种蘸,const修飾的是指針a。因此竞膳,該指針本身(地址)的值是不可改變的航瞭,而該指針所指向的對象的值是可以改變的。(如果指針不明白的坦辟,暫時記著就行刊侯,后面會詳細講解指針)。
2.define定義常量
define實際是一個預處理指令锉走,其實際的用途遠大于定義常量這一功能滨彻。在這里,首先講解define定義常量的基本用法挪蹭,對于其他用途在的后續(xù)文章中會有詳細介紹疮绷。
使用define定義常量實際是進行符號替換,其定義方法為
#define 符號名 替換列表
符號名必須符合標識符命名規(guī)則嚣潜。替換列表可以是任意字符序列冬骚,如數(shù)字、字符懂算、字符串只冻、表達式等,例如:
#define MSG "I'm Antigloss!" /*后面的所有MSG都會被替換為“I'm Antigloss!”*/
#define SUM 99 /*后面的所有SUM都會被替換為99*/
#define BEEP "\a" /*后面的所有BEEP都會被替換為“\a”*/
習慣上计技,人們用大寫字母來命名符號名喜德,而用小寫字母來命名變量。
注意:在使用#define的時候垮媒,要千萬注意最后面是沒有“舍悯;”的,初學者寫代碼習慣在每句代碼后面都加“睡雇;”萌衬,所以這里要小心。
變量
在上一篇文章中它抱,讀者學習了C語言中的基本數(shù)據(jù)類型秕豫。那么在程序中不同數(shù)據(jù)類型的變量如何使用呢?在C語言中使用變量采用先定義、后使用的規(guī)則混移,任何變量在使用前必須先進行定義祠墅。
變量定義的基本形式如下:
說明符(一個或多個) 變量或表達式列表
這里的說明符就是包含一些用于表明變量基本類型的關鍵字、存儲類型和作用域歌径。表格革舉了一些常見基本數(shù)據(jù)類型變量的定義方式毁嗦。
通常,變量在定義時也可以將其初始化回铛,如:
int i = 5;
這條語句實際上轉(zhuǎn)化為兩條語句:
int i; /定義/
i = 5; /初始化/
此外狗准,指針的定義形式在這里需著重說明。
指針的定義形式為標識符加上“”勺届。有些讀者習慣把“”寫在靠近數(shù)據(jù)類型的一側,如:
int* a;
雖然編譯器支持這種定義形式娶耍,但會在閱讀代碼時帶來困擾免姿,例如:
int* b, c, d;
讀者會很自然地認為上面這條語句把3個變量都定義為指向整型的指針。事實上榕酒,只有變量b是整型指針胚膊,而c、d都是整型變量想鹰。因此紊婉,建議讀者在定義指針變量時將“*”寫在靠近變量名的一側,如下所示辑舷。
int *b, *c, *d;
友情提示:
關于變量的定義和變量的聲明是兩個極易混淆的概念喻犁,在形式上也很接近。在對變量進行了定義后何缓,存儲器需要為其分配一定的存儲空間肢础,一個變量在其作用域范圍內(nèi)只能有一個定義。而變量的聲明則不同碌廓,一個變量可以有多次聲明传轰,且存儲器不會為其分配存儲空間。在本書的稍后部分將會講解它們使用上的區(qū)別谷婆。
作用域
變量的作用域定義:程序中可以訪問一個指示符的一個或多個區(qū)域慨蛙,即變量出現(xiàn)的有效區(qū)域,決定了程序的哪些部分通過變量名來訪問變量纪挎。一個變量根據(jù)其作用域的范圍可以分為函數(shù)原型作用域期贫、局部變量和全局變量。
1.函數(shù)原型作用域
函數(shù)原型中的參數(shù)异袄,其作用域始于"("唯灵,結束于")"。
設有下列原型聲明:
double Area(double radius);
radius 的作用域僅在于此隙轻,不能用于程序正文其他地方埠帕,因而可以省略垢揩。
2.局部變量
在函數(shù)內(nèi)部定義的變量稱為局部變量。局部變量僅能被定義該變量的模塊內(nèi)部的語句所訪問敛瓷。換言之叁巨,局部變量在自己的代碼模塊之外是不可見的。
對于局部變量呐籽,要了解的重要規(guī)則是锋勺,它們僅存在于定義該變量的執(zhí)行代碼塊中,即局部變量在進入模塊時生成(壓入堆棧)狡蝶,在退出模塊時消亡(彈出堆棧)庶橱。定義局部變量的最常見的代碼塊是函數(shù),代碼如下:
/*在函數(shù)體類聲明變量*/
void function1(){
int x = 10;
}
void function2 (){
int x;
x = 100;
}
整數(shù)變量x被定義了兩次贪惹,一次在function1中苏章,另一次在function2中。function1和function中的x互不相關奏瞬,原因是每個x作為局部變量僅在被定義的模塊內(nèi)可見枫绅。
3.全局變量
與局部變量不同,全局變量貫穿整個程序硼端,它的作用域為源文件并淋,可被源文件中的任何一個函數(shù)使用。它們在整個程序執(zhí)行期間保持有效珍昨。示例代碼:
#include <stdio.h>
int a,b;//全局變量
void function (){
}
float x,y;
void function2 (){
}
int main(int argc, const char * argv[]) {
return 0;
}
得出結論:從上例可以看出a县耽、b、x镣典、y都是在函數(shù)外部定義的外部變量酬诀,都是全局變量。x骆撇、y定義在函數(shù)function1之后瞒御,在function1內(nèi)沒有對x、y的聲明神郊,所以它們在function1內(nèi)無效肴裙。a、b定義在源程序最前面涌乳,即所有函數(shù)之前蜻懦,因此在function1、function2及main內(nèi)不加聲明就可使用夕晓。
可以看到宛乃,使用全局變量可以有效地建立起幾個函數(shù)相互之間的聯(lián)系。對于全局變量還有以下幾點說明。
① 對于局部變量的定義和聲明征炼,可以不加區(qū)分析既,而對于全局變量則不然。全局變量的定義和全局變量的聲明并不是一回事谆奥,全局變量定義必須在所有的函數(shù)之外眼坏,且只能定義一次,其一般形式為
[extern] 類型說明符 變量名酸些,變量名……
其中方括號內(nèi)的extern可以省去不寫宰译,例如:
int a,b;
等效于:
extern int a,b;
而全局變量聲明出現(xiàn)在要使用該變量的各個函數(shù)內(nèi)。在整個程序內(nèi)魄懂,可能出現(xiàn)多次沿侈。全局變量聲明的一般形式為
extern 類型說明符 變量名,變量名……
全局變量在定義時就已分配了內(nèi)存單元市栗,并且可做初始賦值缀拭。全局變量聲明不能再賦初始值,只是表明在函數(shù)內(nèi)要使用某外部變量肃廓。
② 外部變量可加強函數(shù)模塊之間的數(shù)據(jù)聯(lián)系智厌,但是又使函數(shù)要依賴這些變量诲泌,因而使得函數(shù)的獨立性降低盲赊。從模塊化程序設計的觀點來看這是不利的,因此在不必要時盡量不要使用全局變量敷扫。
③ 全局變量的內(nèi)存分配是在編譯過程中完成的哀蘑,它在程序的全部執(zhí)行過程中都要占用存儲空間,而不是僅在需要時才開辟存儲空間葵第。
④ 在同一源文件中绘迁,允許全局變量和局部變量同名。在局部變量的作用域內(nèi)卒密,全局變量不起作用缀台。因此,若在該函數(shù)中想要使用全局變量哮奇,則不能再定義一個同名的局部變量膛腐。
#include <stdio.h>
/*定義全局變量i并賦初值為5*/
int i = 5;
int main()
{
/*定義局部變量i,并未賦初值鼎俘,i的值不確定哲身,由編譯器自行給出*/
int i;
/*打印出i的值,查看在此處的i是全局變量還是局部變量*/
if(i != 5)
printf ("it is local\n");
printf ("i is %d\n",i);
return 0;
}
運行結果:it is local
i is 134518324Program ended with exit code: 0
可以看到贸伐,i的值并不是全局變量所賦的初值勘天,而是局部變量的值。
⑤ 全局變量的作用域可以通過關鍵字extern擴展到整個文件或其它文件。
補充:printf 和 scanf
printf就是一個輸出函數(shù)脯丝,把輸出結果打印到控制臺上商膊,
scanf函數(shù)就是用來接收用戶輸入的內(nèi)容,可以是字符巾钉,字符串翘狱、數(shù)字等類型。
我們來看一個示例吧:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int a;//聲明一個變量
int b;
printf("請輸入兩個數(shù)");
scanf("%d\n%d",&a,&b);//用scanf函數(shù)接受用戶輸入的a,b砰苍,這里用了&這個符號潦匈,這個符號是取地址符的意思,相當于通過指針給a和b賦值赚导。
int sum;
sum = a + b;//求和
printf("a = %d\nb = %d\nsum = %d",a,b,sum);//打印輸出
return 0;
}
輸出結果:
請輸入兩個數(shù)
2
4
a = 2
b = 4
sum = 6Program ended with exit code: 0
總結
本篇文章向讀者介紹了C語言中如何定義一個變量和常量茬缩,以及介紹了作用域的相關知識,補充說明了printf和scanf函數(shù)的用法吼旧,希望讀者下去認真深刻的體會凰锡,學會舉一反三。
結尾
最后圈暗,希望讀者在讀文章的時候發(fā)現(xiàn)有錯誤或者不好的地方掂为,歡迎留言,我會及時更改员串,感謝你的閱讀和評論已經(jīng)點贊收藏勇哗。