不一樣的C語言-變量

變量

  筆者是一名正在步入嵌入式Linux的程序猿。在鞏固C語言之餘,筆者認爲有必要將其整理成一系列的文章。遐思片刻,爲本系列文章取名《不一樣的C語言》。不一樣的C並不是說筆者所整理的C非STDC(標準C),而是筆者拋開C語言書籍,根據自己的認識所寫的C語言系列文章。也許入C未深的我,對於一些概念有錯誤的理解,望網名能夠多多包涵和指正。話不多說,下面馬上開篇!

  有一個公式:數據結構 + 算法 = 程序。對於面向過程的C語言來說,顯然這是正確的。實現色彩斑斕的程序的畫筆,正是它--變量。 

一、變量是什麼

  顧名思義,變量就是在程序執行過程中可以根據需要變化的量。一說到變量,大多數C語言初學者腦子裏浮現的是int,char,float...你們的反射也並沒有什麼不妥,因爲你們把變量和類型深深的綁定到了一起。而筆者腦子裏浮現的是一段抽象化的存儲空間。我們先從變量的定義談起。

  定義一個變量的格式:類型 變量名

  從語法我們知道,定義一個 變量,我們首先要知道變量是什麼類型,然後爲這個變量其一個合適的名字。不知道你們會不會感覺奇怪,爲什麼我們要寫類型,至少筆者是敏感的。

  在說出筆者的敏感之前,我們先來了解一下強類型語言和弱類型語言。C語言是強類型語言(當然C++/JAVA都是),PHP、JavaScript等絕大部分腳本語言是弱類型語言。那麼強和弱的區別在哪裏?區別之一就是:強類型語言在定義變量的時候需要指出變量的具體類型,而弱類型語言則顯得簡單了,PHP直接 $變量名,JavaScript直接 var 變量名。筆者敏感的正是類型,在定義一個變量的時候,我們指明瞭變量的類型,也正是因爲如此編譯器知道了如何去給我們在存儲空間中申請符合我們類型大小的空間,然後把他的操作入口給變量名。打個比方,變量名就是一把鑰匙,而他真正打開的是一所符合我們家庭大小的房子(當然你可以通過手段越界)。

  我們再回過頭來思量變量,這時的你也許就不會出現int,char,float...出現的是一段存儲空間,然後根據變量的類型來確定我們需要如何解釋這段空間。到此,筆者重新給變量一個定義:變量是一段用特殊方法解釋的可用供程序員修改的存儲空間。

二、從unsigned類型修飾符談變量

  衆所周知,C語言數據類型分爲:基本數據類型,複合數據類型(構造類型),空類型(void)。對於基本數據類型又可以細分爲整形和浮點型。不知讀者是否又真正思考過,整型和浮點型除了佔用內存字節數有所差異意外,有什麼不同。搞清楚這裏面的奧祕,我們首先從設計C語言本身的角度來思考,爲什麼需要區分整型和浮點型。整形所要表達的是整數,浮點型所要表達的是小數。我們知道,計算機內存中只能存儲二進制的0和1,那麼這麼有限的符號如何來表達整數和小數呢?C語言的設計者將整數的表達和小數的表達單獨列了出來。下面我們來談一談整形和浮點型在內存中是如何規定的,以32位機器爲例。
  整形分爲:int,short int,long int,long long int。其對應機器是多少字節這裏不作詳細的介紹。我們以int爲例來看看在內存中是如何規劃的。首先我們應該知道的是整形分爲有符號和無符號,定義的時候沒有加上unsigned修飾符則默認爲有符號。接下來我們看看有符號的int在內存中如何分佈。

31~24 23~16 15~8 7~0
最高位31,是符號位,0表示正數,1表示負數。其餘31個位是數據位。所以int的取值範圍是 -2^31 ~ 2^31 -1。對於unsigned int那就更簡單了32個位全部都是數據位,所以unsigned int的取值範圍 0~2^32-1。
  舉上面的例子,並不是正真的想告訴你們整型在內存中是如何分佈的,也許如何分佈你們已經滾瓜爛熟。舉這個例子,是想舉一反三的告訴大家,變量的類型,無非就是C語言的設計者事先規定好的如何對一段已知的存儲空間存和取,當然存很多時候不需要我們插手。這要我麼把這一點摸透,那麼變量類型在我們的眼裏就是紙老虎。

三、從變量的類型轉換談變量:

  C語言中,類型轉換可以分爲隱式轉換和顯式轉換(強制轉換)。隱式是編譯器幫我們做的,我們並不需要關心。但倘若真不關心,則會出錯。說到類型轉換,筆者要拿一個簡單的例子來加以闡述:
char c = 'a';
int i = c;

打印 i 的值,則爲97,這是安全的轉換,因爲int的內存空間足夠裝下char。下面我們反過來:
int i = 255;
unsigned char c = (char)i;

按照int的類型來打印c,結果是255,這看起來並沒有什麼不妥,但是這是不安全的,如果是256此時就會溢出了。
這兩個例子,可能對讀者的啓發並不大。但是我們看內存的角度來看看這兩次轉換,之所以能夠成功,是因爲,變量真的只是一段可以存儲數據的空間而已,沒有那麼神奇,他只是冷冰冰的0和1,你想對其操作(即使是不安全的)都是能夠爲所欲爲的,但是由於存儲大小和規則的不同,帶來的數據安全問題就要由程序員自己考慮,是把雙刃劍。

總結:

  寫到這裏,筆者認爲對於變量的初步探究到此就可以收尾了。讓讀者清楚的認識到變量的本質,然後通過大量的編碼去體會變量,才能真正體會到本文中對於變量的闡述。JAVA中一切皆對象,C語言中,一切皆內存。如果你能體會這句話,你就開始步入C語言了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章