變量和常量
1、什麼是常量?什麼是變量?
當我打開一個遊戲,遊戲人物的身高(假設是不變的),就是一個常量,遊戲人物的血量,受到敵人的傷害就會減少,血量就是變量,在一個程序中,恆定不變的量叫常量,可變的量叫變量。
2、變量的命名規則
我們將程序中常量、變量、函數的名稱稱爲標識符,標識符的命名規則如下:
- 只能由字母、數字和下劃線組成,且不能以數字開頭。
- 嚴格區分大小寫。
- 不能使用C語言中的關鍵字。
- 同一程序中,變量和函數都不可以重複定義。
- 滿足以上四點的任意命名都是合法的,但我們爲使程序便於閱讀,通常使標識符名稱具有實際含義,例如我寫一個加法函數,那麼我可以命名爲add。
例如:int 3a
就不對,因爲不能以數字開頭,int void
也不對,因爲void是關鍵字。
new
在C語言中可以用,但在C++中不能用,因爲new是C++的關鍵字
3、定義變量
什麼叫定義變量?
計算機是一種精確的,有條理的機器,要將信息存儲在計算機中,必須指出信息的存儲位置和所需的內存空間,定義語句的作用就是指明存儲類型並提供位置標籤。
比如int a;
,這條語句提供了兩條信息:需要的內存以及該內存單元的名稱。即這條語句指出程序需要足夠的儲存空間來儲存一個整數,int表示整數類型。編譯器負責分配和標記內存的細節。C/C++可以處理多種類型的數據,整數可以爲正,也可以爲負。
爲什麼變量必須定義呢?
有些語言在使用新名稱時就會創建新的變量,而不需要顯示地定義。這看上去對用戶比較友好,事實上從短期上來看確實如此。但有時候你可能會錯誤的拼寫變量名,在不知情的情況下創建了一個新的變量,而你把它當作舊的變量使用,就會產生很難察覺的問題。
什麼是初始化變量呢?
給變量賦予一個初始值,就意味着將這個變量初始化了。我們可以在定義變量的同時初始化變量,也可以先定義再初始化。
定義並初始化的方式如下:
定義後初始化
int a;//定義變量
int b;//定義變量
int c;//定義變量
a = 1;//初始化變量
b = 2;//初始化變量
c = c;//初始化變量
printf("%d %d %d", a, b, c);
此時會打印出:
1 2 3
定義同時初始化:
int a = 1;//定義時初始化
int b = 2;//定義時初始化
int c = 3;//定義時初始化
printf("%d %d %d", a, b, c);
打印結果爲:
1 2 3
多個變量同時定義並初始化:
int a = 1, b = 2, c = 3;//同類型的變量一起定義並初始化
printf("%d %d %d", a, b, c);
打印結果爲:
1 2 3
多個變量同時定義後初始化:
int a, b, c;
a = 1;
b = 2;
c = 3;
printf("%d %d %d", a, b, c);
打印結果爲:
1 2 3
多個變量同時定義並部分初始化:
int a, b, c = 3;
printf("%d %d %d", a, b, c);
此時無法打印,會提示未初始化變量a,b。int a, b, c = 3;
這條語句相當於定義了3個變量但只初始化了c,並不是將數值3賦值給了所有變量,這是新手很容易犯錯的地方。
爲什麼一定要初始化?
事實上不初始化也可以編譯通過並且執行,C語言在這方面擁有很高的自由度,但新版的編譯器添加了相關的檢錯機制,因爲哪怕不初始化可以通過編譯並且執行,使用到了未初始化變量依然被認爲是程序中的錯誤。一個變量不初始化就沒有存在的意義,更重要的是,如果忘記初始化一個變量,我們可能就會從其它程序遺留下來的內存中獲取到垃圾數據。
當我們運行一個程序時,電腦需要給程序中的變量和常量分配內存,運行程序會在內存地址上標識,告訴電腦”這塊內存我佔用了,別的程序不能用“。,而關閉程序時,內存裏的垃圾數據可能並不會被回收,只是在地址上標識,”這塊內存我不用了,誰想用可以拿去用“,這時候如果你的某個變量正好用到了其中的一個內存空間,你初始化的時候就會用你想要的值將前面的程序遺留的垃圾數據覆蓋掉,而如果不初始化,你的變量就會獲取到這些垃圾數據。
4、變量的內存機制
在計算機中,變量儲存在內存中,每一個變量都會被分配到一塊內存空間,內存空間中儲存的就是變量的值。內存空間裏的值變化,變量的值也就會變化。一個內存空間裏同一時間只能保存一個值,如果有新的值儲存,就是覆蓋掉舊值。每一個內存單元都有編號,編號就是此內存單元對應的地址。
我們可以將一個變量的地址打印出來:
#include<stdio.h>
#include<stdlib.h>
int main() {
int num = 100;
printf("%d,%p", num, &num);//%d是以十進制形式打印,%p用來打印地址,十六位的十六進制,&num是取地址,這行代碼意思是將num的值以十進制形式的形式打印出來,將num的內存地址以十六位十六進制的形式打印出來。
num = 150;//此處插入斷點
system("pause");
return 0;
}
我們進行調試:
斷點出輸出結果爲:
100,000000EF46CFFC34
這說明此時num的值爲100,內存地址爲0x000000EF46CFFC34。
我們點擊【調試】- 【窗口】 - 【內存】,講上面輸出的內存地址粘貼到地址欄裏,點擊繼續運行可以看到內存地址中的變量值的變化:
當我們計算1+2 =3時,
代碼如下:
void main(){
int a;
int b;
int c;
a = 1;
b = 2;
c = a + b;
}
當我們定義變量時,計算機爲a、b、c分別分配了一個整數類型的內存空間,每一個內存空間對應一個內存地址。當給a賦值1時,運算器裏產生一個數據1,控制器找到a的內存地址,並將數據1儲存到此地址對應的內存裏。運用同樣的方法給b賦值。計算c = a + b時,在運算器完成計算,計算結果是3,由控制器找到c的地址,將數值3儲存到此的內存空間裏。這樣就完成了一個基礎的加法運算。
5、定義常量
前面講了定義變量,定義常量方式如下:
常量命名規則在語法上和變量一樣,但規範上不盡相同,常量命名一般由大寫字母和下劃線組成。
在變量定義前面加上const(constant):
#include<stdio.h>
void main(){
const int A = 1;
printf("%d", A);
}
打印結果爲:
1
如果這樣寫:
void main(){
const int A = 1;
A = 2;
}
就會報錯,這是因爲常量是隻可讀不可寫的。
因此常量在定義是就需要初始化:
#include<stdio.h>
void main() {
const int A = 1, B = 2, C = 3;
printf("%d %d %d", A, B, C);
}
打印結果爲:
1 2 3
我們還可以使用宏定義的方式來定義常量:
#include<stdio.h>
void main(){
#define X 100
printf("%d", X);
}
打印結果:
100
宏定義的本質是字符的替換,#define X 100
本質上是將程序中的所有X替換爲100,且是批量替換,即如果有多個X,那麼在將#define X 100
中的100改爲101時,每一個X都會由100變成101。
#define
可以替換程序中的任何字符,比如我用void取代_那麼程序可以寫爲:
#define _ void
_ main(){
}
這樣也是合法的且可以正常運行。
爲什麼#define X 100
後面不加分號,這是因爲如果加了分號;那麼就意味着X替換的是100;而不是100。
宏定義可以替換任何字符,包括括號(){}等字符,甚至可以將所有關鍵字和函數替換成中文,這樣就開發出了一套“中文編程語言”。
關注微信公衆號axxd_lz回覆【C語言】獲取視頻教程和電子書。