C語言的常量接癌、變量及作用域

謹記

當你感覺累的時候心赶,說明你還活著,當你突然感覺不到的累那一刻缺猛,也就意味著你已經(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)點贊收藏勇哗。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寸齐,隨后出現(xiàn)的幾起案子欲诺,更是在濱河造成了極大的恐慌,老刑警劉巖渺鹦,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扰法,死亡現(xiàn)場離奇詭異,居然都是意外死亡毅厚,警方通過查閱死者的電腦和手機塞颁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吸耿,“玉大人祠锣,你說我怎么就攤上這事珍语〈赴叮” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵板乙,是天一觀的道長是偷。 經(jīng)常有香客問我拳氢,道長,這世上最難降的妖魔是什么蛋铆? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任馋评,我火速辦了婚禮,結果婚禮上刺啦,老公的妹妹穿的比我還像新娘留特。我一直安慰自己,他們只是感情好玛瘸,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布蜕青。 她就那樣靜靜地躺著,像睡著了一般糊渊。 火紅的嫁衣襯著肌膚如雪右核。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天渺绒,我揣著相機與錄音贺喝,去河邊找鬼。 笑死宗兼,一個胖子當著我的面吹牛躏鱼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播殷绍,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼染苛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了篡帕?” 一聲冷哼從身側響起殖侵,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤贸呢,失蹤者是張志新(化名)和其女友劉穎镰烧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楞陷,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡怔鳖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了固蛾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片结执。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖艾凯,靈堂內(nèi)的尸體忽然破棺而出献幔,到底是詐尸還是另有隱情,我是刑警寧澤趾诗,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布蜡感,位于F島的核電站蹬蚁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏郑兴。R本人自食惡果不足惜犀斋,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望情连。 院中可真熱鬧叽粹,春花似錦、人聲如沸却舀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挽拔。三九已至持钉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篱昔,已是汗流浹背每强。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留州刽,地道東北人空执。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像穗椅,于是被迫代替她去往敵國和親辨绊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容