謹記
當你感覺累的時候,說明你還活著,當你突然感覺不到的累那一刻,也就意味著你已經(jīng)被社會淘汰了,人活著就的受累,因為:活著就是為了改變世界。
目標:學習C語言的變量、常量及作用域等
通過這篇文章,你將了解到C語言中有關常量、變量、作用域等知識點,本篇文章將結合程序進行一個展示,當然也同樣希望讀者能自行舉一反三。
常量
1.const定義常量
在C語言中,可以使用const來定義一個常量。只需在變量名前加上const即可。
int const a;
以上語句定義了a為一個整數(shù)常量。那么,既然a的值不能被修改,如何讓a擁有一個值呢?
這里,一般有兩種方法,其一是在定義時對它進行初始化,如下所示。
int const a = 100;
其二,在函數(shù)中聲明為const的形參在函數(shù)被調用時會得到實參的值。
在這里需要著重講解的是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;
這條語句實際上轉化為兩條語句:
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)點贊收藏。