做者 謝恩銘,公衆號「程序員聯盟」。 轉載請註明出處。 原文:www.jianshu.com/p/8db33987c…git
《C語言探索之旅》全系列程序員
上一課咱們學習的是 C語言探索之旅 | 第一部分第四課:變量的世界(一),內存那檔事。相信我,上一課對於內存的初探絕對頗有用。這一課咱們一塊兒來學習變量的聲明。github
簡單地說,變量就是暫時儲存在內存中的一小段信息。bash
爲何叫作變量呢?函數
變量的英語是 variable,作形容詞用的話是「可變的,易變的」之意,因此變量就是在程序運行期間其值能夠改變的量。學習
你將會看到,咱們寫的程序,經常是充滿變量的。ui
在 C語言中(大多數語言也是如此),一個變量有兩部分:編碼
在 C語言中,每個變量必需要有一個名字。咱們可不能隨便取名字,還要遵照一些限制條件:spa
_
),其餘一概禁止。如下是一些正確的變量名:操作系統
dog,cat_and_mouse,Catch_1_mouSe,hao123COM
還要記得的是,C語言對大小寫敏感,因此,hello 和 Hello 是兩個不一樣的變量名。
每個程序員都有本身命名變量的習慣,我來講說本課程的變量命名習慣吧:
但願你們在以後的練習題中也能儘可能保持一致的命名習慣(其實這是比較通用的命名法)。
命名變量時,儘可能使之清晰易懂,若是我把一個變量 petName(表示是「寵物名字」)縮寫爲 pN,雖然短小精悍,可是閱讀代碼的人確定猜不出來是什麼意思。
咱們要儘可能作到代碼是能夠「自注釋」的,就是說光看變量名就能夠知道這個變量的用途,不少時候就能夠省略註釋了。
咱們的電腦兄,實際上是一臺笨笨的機器,只知道計算,只能處理數字。
可是,在 C語言當中,數字卻有好多類型:
怎麼有這麼多亂七八糟的類型啊,可憐的電腦兄須要幫助...
因此,當你要求電腦儲存一個數字時,須要給出類型。倒並非說電腦沒辦法區分,而是爲了電腦能更好地規劃,也爲了避免佔用多餘的內存。
所以,在 C語言中,當咱們聲明一個變量時,必需要給出變量類型。
下表列出了主要的一些類型:
類型名 | 最小值 | 最大值 |
---|---|---|
signed char | -128 | 127 |
int | -32768 | 32767 |
long | -2147483648 | 2147483647 |
float | -1 x 10^37 | 1 x 10^37 |
double | -1 x 10^37 | 1 x 10^37 |
注意:上面列出的數據是 C語言所保證的最小的取值範圍。實際上,你每每能夠在上述類型中存放更大的數值。 例如,這裏的 int 保證最小取值範圍是 -32768 到 32767,是針對 2 字節大小的 int 型來講的。通常如今的 32 位或 64 位操做系統裏 int 是 4 字節,取值範圍是 -2147483648 到 2147483647。
不過,最好能稍微記得上表中的值,對你正確選擇變量類型有幫助。
固然 C語言還有其餘的變量類型,上表只是列出了經常使用的。
下面給出 C語言全部變量類型:
以前的表格中前三種類型(signed char,int,long)用於聲明整數。如:6,74,8931,等。
後兩種類型(float,double)用於聲明浮點數(包含小數點的數)。如:7.64,61.467,等。
以後的課程你會看到整數用得最多,由於簡單易用。
說一下 signed 和 unsigned 的區別:signed 就是有符號的,就是最開始有正號或者負號(正數或負數),如 7,-5,9.2,-23.8,等。unsigned 是無符號數,只能是正數或零,如 35,7461,61.789,等。
因此 signed int 就是有符號整數,unsigned int 是無符號整數。依此類推。
signed 和 unsigned 放在 int,long,char,float,double 等類型的前面。
類型名 | 最小值 | 最大值 |
---|---|---|
unsigned char | 0 | 255 |
unsigned int | 0 | 65535 |
unsigned long | 0 | 4294967295 |
上面的表格中,咱們能夠看到,unsigned 類型不能儲存負數,可是相比 signed 類型的優點是能夠儲存兩倍於 signed 類型的最大值,例如 signed char 最大值是 127,unsigned char 最大值是 255。
char 實際上也能夠當作是一種整型(這樣說可能有點錯誤),由於每一個字符的編碼實際上也是用整型編的(能夠查 ASCII 碼錶)。若是你將它強行轉換爲整型,是能夠轉的。不少時候,咱們都會將 char 轉成整型來計算或比較,舉個例子,'A'(大寫字母 A)對應 65。
爲何對於整數,以前的表裏面列出了三種類型:char,int,long 呢?一種不夠嗎?
是這樣的,C語言最初建立多種整數類型的目的是爲了節約內存。若是咱們聲明一個 char 類型的變量,相比於 int 類型,電腦所使用的內存空間就要小。
固然了,在內存頗有限的那個年代(「遙想公瑾當年,小喬初嫁了...」),多種整數類型頗有用。今天,咱們的電腦有至關多的內存(「俱往矣,數風流人物,還看今朝~」),因此通常已經不須要捉襟見肘地聲明變量了。不過,對於內存有限的嵌入式的某些應用,仍是須要謹慎地使用整數類型。
作個小結:
作了這麼多鋪墊,終於到了咱們的主題了。如今,建立一個新的控制檯項目,就取名叫 Variable 吧。
咱們一塊兒來學習如何聲明變量,也就是請求電腦分配一些內存空間給咱們使用。
聲明變量其實很簡單,你應該知道怎麼作了。只須要按照下面的順序:
好比,我能夠這樣聲明一些變量
int growthOfEconomy;
double averageSalary;
unsigned int numberOfDogs
複製代碼
以上咱們所作的被稱爲「變量聲明」,請記住這個術語。你應該在函數的開始聲明變量。既然咱們目前只有一個函數:main 函數,咱們就這樣聲明一個變量:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int numberOfDogs;
return 0;
}
複製代碼
若是你運行上述程序,你會驚訝的發現:這個程序貌似啥也沒幹。
好了,在你要指控我欺騙你以前,容我辯解一下:
事實上,這個程序是幹了一些事情,只不過你看不到。當程序讀到變量聲明那一行時,它頗有禮貌地詢問電腦是否能夠用一些內存空間。
若是一切順利,電腦會回答「好的,沒問題,拿一些內存空間去吧」。一般來講,是會順利進行的。因此你的變量通常來講(除非內存不夠了,可是不多會這樣,由於你只是要求分配一個 int 的空間,不多的)確定建立了。
一個小「技巧」:若是你有好幾個同一類型的變量要聲明,不必每個變量的聲明都寫一行,你能夠都寫在一行上,例如:
int numberOfDogs, numberOfCats, numberOfMouses;
複製代碼
就同時聲明瞭三個 int 類型的變量:numberOfDogs,numberOfCats,numberOfMouses 。
而後呢?
既然咱們已經聲明瞭變量,那咱們接下來能夠給變量賦一個值。
沒有比這更簡單的了。若是你要給上面的變量 numberOfDogs 賦值,只要這樣寫
numberOfDogs = 7;
複製代碼
不用作什麼其餘的了。你寫上變量名,而後寫一個等號,接着寫你要給它的值。
上面,咱們剛把 7 賦給了 numberOfDogs(表示「狗的數目」)。
所以,咱們的完整程序如今是這樣的:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int numberOfDogs;
numberOfDogs = 7; // 有七條狗
return 0;
}
複製代碼
此次你若是運行一下,也沒有發生什麼,屏幕上什麼也沒顯示。但其實一切都悄然在內存中進行,只不過你看不到罷了。
在你電腦深處的某個地方,一小塊內存上剛儲存了 7 這個值。是否是很神奇呢?
咱們能夠試着改變變量的值,好比像這樣:
int numberOfDogs;
numberOfDogs = 7;
numberOfDogs = 6;
numberOfDogs = 5;
複製代碼
上述例子中,numberOfDogs 這個 int 類型的變量首先會被賦值爲 7,以後改成 6,再改成 5。由於你的電腦運算速度太快,因此這一系列操做都是瞬間就完成了。還沒來得及眨眼,你的變量 numberOfDogs 的值就從 7,變爲 6,再變爲 5。
如今來看一個很重要的問題:當咱們聲明一個變量時,它的初始值是多少呢?
實際上,當電腦讀到這一行:
int numberOfDogs;
複製代碼
首先,它在內存中取了一小塊出來給 numberOfDogs 用。可是這時 numberOfDogs 的值是多少呢?有沒有一個默認值(好比 0)呢?
答案是:沒有。
沒有默認值。事實上,內存的這小塊區域是給了 numberOfDogs,可是上面的值並無改變,咱們並無清空在這小塊內存上原來有的值。因此,你的變量 numberOfDogs 的初始值就是在那一小塊內存上的值,這個值能夠是任意的。
若是這塊內存的值先前沒有改變過,那多是 0。
你並不能肯定,有可能初始值是 45 或 182,由於可能以前有一個程序已經改變了那塊地址上的值。
因此要當心,最好的解決方案是當你聲明變量時,同時爲它賦一個初值:
int numberOfDogs = 7;
複製代碼
這裏,int 型變量 numberOfDogs 被聲明,而且當即被賦值爲 7。
這樣作的好處是:你能夠肯定這個變量的值是什麼,不會是任意的一個數。
有時咱們想要使用一個變量,咱們又但願它的值在程序中保持不變。就是說,一旦聲明,你但願你的變量就保持它的初始值,沒有人能更動它。
這種特殊的變量被稱爲 constant(表示「恆定的,不變的」)變量,由 const 關鍵字修飾。
有的書本說 const 修飾的是常量,這種說法是不許確的。const 修飾的是變量,只不過是只讀的變量。由於加上 const 以後,值就不能再改變了。
如何聲明一個 constant 變量呢?很簡單:
只要把 const 關鍵字放在你的變量的類型前面(放在後面也是能夠的),此外,聲明 constant 變量時,必須給它賦初值!
例如:
const int NUMBER_OF_DOGS = 7;
複製代碼
並非必定要大寫 const 變量的名字,只是通常用大寫,這已經成爲了一個約定俗成的習慣。
除了值不能改變,const 變量和通常變量同樣。只不過假如你要在以後的程序中改變 const 變量的值,編譯器會提示一個錯誤,例如:
[Warning] assignment of read-only variable 'NUMBER_OF_DOGS'
(表示「[警告] 試圖改變只讀變量 NUMBER_OF_DOGS 的值」)
複製代碼
今天的課就到這裏,一塊兒加油吧!
下一課:C語言探索之旅 | 第一部分第六課:變量的世界(三),顯示變量內容
我是 謝恩銘,公衆號「程序員聯盟」運營者,慕課網精英講師 Oscar 老師,終生學習者。 熱愛生活,喜歡游泳,略懂烹飪。 人生格言:「向着標杆直跑」