c++Primer學習筆記之五:變量和基本類型_1

基本內置類型

不管是什麼編程語言,總少不了基本的變量和數據類型,c++也是如此,也跟大部分語言一樣,擁有如下基本類型:

算術類型:整型,浮點型,單個字符和布爾型

另外有個特殊的void類型,通常用作無返回值函數的返回類型

學習時候最好能夠弄清楚自己的機器對於對應的數據類型的字長(反正我是不清楚)


幾個關於使用內置算數類型的建議:

1、 當執行整型算術運算時,很少使用 short 類型。大多數程序中,使用short 類型可能會隱含賦值越界的錯誤。這個錯誤會產生什麼後果將取決於所使用的機器。比較典型的情況是值“截斷(wrap around)”以至於因越界而變成很大的負數。同樣的道理,雖然 char 類型是整型,但是 char 類型通常用來存儲字符而不用於計算。事實上,在某些應用中char 類型被當作 signed 類型,在另外一些應用中則被當作 unsigned 類型,因此把 char 類型作爲計算類型使用時容易出問題。


2、在大多數機器上,使用 int 類型進行整型計算不易出錯。就技術上而言,int 類型用 16 位表示——這對大多數應用來說太小了。實際應用中,大多數通用機器都是使用和 long 類型一樣長的 32 位來表示 int 類型。整型運算時,用 32 位表示 int 類型和用 64 位表示 long 類型的機器會出現應該選擇 int 類型還是 long 類型的難題。在這些機器上,用 long 類型進行計算所付出的運行時代價遠遠高於用 int 類型進行同樣計算的代價,所以選擇類型前要先了解程序的細節並且比較 long 類型與 int 類型的實際運行時性能代價。 


3、決定使用哪種浮點型就容易多了:使用 double 類型基本上不會有錯。在 float 類型中隱式的精度損失是不能忽視的,而 double 類型精度代價相對於 float 類型精度代價可以忽略。事實上,有些機器上,double 類型比 float 類型的計算要快得多。long double 類型提供的精度通常沒有必要,而且還需要承擔額外的運行代價。 


字面值常量

定義字面值整數常量可以使用以下三種進制中的任一種:十進制、八進制和十六進制。當然這些進制不會改變其二進制位的表示形式。例如,我們能將值 20定義成下列三種形式中的任意一種: 
20 // decimal 
024 // octal 
0x14 // hexadecimal

以 0(零)開頭的字面值整數常量表示八進制,以 0x 或 0X 開頭的表示十六進制。


通常可以用十進制或者科學計數法來表示浮點字面值常量。使用科學計數法時,指數用 E 或者 e 表示。默認的浮點字面值常量爲 double 類型。在數值的後面加上 F 或 f 表示單精度。同樣加上 L 或者 l 表示擴展精度(再次提醒,不提倡使用小寫字母 l)。下面每一組字面值表示相同的值: 
3.14159F          .001f                  12.345L                     0. 
3.14159E0f        1E-3F               1.2345E1L             0e0 


單詞 true 和 false 是布爾型的字面值: 
bool test = false; 


轉義字符

轉義字符都以反斜線符號開始,C++ 語言中定義瞭如下轉義字符: 
換行符                  \n             水平製表符 \t
縱向製表符          \v                退格符  \b
回車符                   \r                進紙符  \f
報警(響鈴)符  \a                反斜線  \\
疑問號                  \?                 單引號  \'
雙引號                  \"   


字符串字面值


字符串字面值常量用雙引號括起來的零個或者多個字符表示。不可打印字符表示成相應的轉義字符。 

"Hello World!" // simple string literal 

"" // empty string literal 

"\nCC\toptions\tfile.[cC]\n" // string literal using newlines and tabs 

爲了兼容 C 語言,C++ 中所有的字符串字面值都由編譯器自動在末尾添加一個空字符。字符字面值 

'A' // single quote: character literal 表示單個字符 A,然而 

"A" // double quote: character string literal 表示包含字母 A 和空字符兩個字符的字符串。

字符串字面值的連接

兩個相鄰的僅由空格、製表符或換行符分開的字符串字面值(或寬字符串字面值),可連接成一個新字符串字面值。這使得多行書寫長字符串字面值變得簡單: 

// concatenated long string literal 
std::cout << "a multi-line " 
	     "string literal " 
	     "using concatenation" 
	   << std::endl; 

執行這條語句將會輸出: 

a multi-line string literal using concatenation 


變量

變量提供了程序可以操作的有名字的存儲區。C++ 中的每一個變量都有特定的類型,該類型決定了變量的內存大小和佈局、能夠存儲於該內存中的值的取值範圍以及可應用在該變量上的操作集。C++ 程序員常常把變量稱爲“變量”或“對象(object)”。

C++ 是一門靜態類型語言,在編譯時會作類型檢查。 在大多數語言中,對象的類型限制了對象可以執行的操作。如果某種類型不支持某種操作,那麼這種類型的對象也就不能執行該操作。 

在 C++ 中,操作是否合法是在編譯時檢查的。當編寫表達式時,編譯器檢查表達式中的對象是否按該對象的類型定義的使用方式使用。如果不是的話,那麼編譯器會提示錯誤,而不產生可執行文件。

 隨着程序和使用的類型變得越來越複雜,我們將看到靜態類型檢查能幫助我們更早地發現錯誤。靜態類型檢查使得編譯器必須能識別程序中的每個實體的類型。因此,程序中使用變量前必須先定義變量的類型


變量名,即變量的標識符,可以由字母、數字和下劃線組成。變量名必須以字母或下劃線開頭,並且區分大小寫字母:C++ 中的標識符都是大小寫敏感的。
下面定義了 4 個不同的標識符: 

// declares four different int variables 
int somename, someName, SomeName, SOMENAME;
C++ 保留了一組詞用作該語言的關鍵字。關鍵字不能用作程序的標識符。下表列出了 C++ 所有的關鍵字。 
 C++ 關鍵字


C++ 還保留了一些詞用作各種操作符的替代名。這些替代名用於支持某些不支持標準 C++操作符號集的字符集。它們也不能用作標識符。下表 列出了這些替代名。

C++ 操作符替代名

除了關鍵字,C++ 標準還保留了一組標識符用於標準庫。標識符不能包含兩個連續的下劃線,也不能以下劃線開頭後面緊跟一個大寫字母。有些標識符(在函數外定義的標識符)不能以下劃線開頭。

變量命名習慣

變量命名有許多被普遍接受的習慣,遵循這些習慣可以提高程序的可讀性。 

•  變量名一般用小寫字母。例如,通常會寫成 index,而不寫成 Index 或 INDEX。 

•  標識符應使用能幫助記憶的名字,也就是說,能夠提示其在程序中的用法的名字,如 on_loan 或 salary。 

•  包含多個詞的標識符書寫爲在每個詞之間添加一個下劃線,或者每個內嵌的詞的第一個字母都大寫。例如通常會寫成 student_loan 或 studentLoan,而不寫成 studentloan。


變量初始化 

使用未初始化的變量是常見的程序錯誤,通常也是難以發現的錯誤。雖然許多編譯器都至少會提醒不要使用未初始化變量,但是編譯器並未被要求去檢測未初始化變量的使用。而且,沒有一個編譯器能檢測出所有未初始化變量的使用。 

有時我們很幸運,使用未初始化的變量導致程序在運行時突然崩潰。一旦跟蹤到程序崩潰的位置,就可以輕易地發現沒有正確地初始化變量。 但有時,程序運行完畢卻產生錯誤的結果。更糟糕的是,程序運行在一部機器上時能產生正確的結果,但在另外一部機器上卻不能得到正確的結果。添加代碼到程序的一些不相關的位置,會導致我們認爲是正確的程序產生錯誤的結果。 

問題出在未初始化的變量事實上都有一個值。編譯器把該變量放到內存中的某個位置,而把這個位置的無論哪種位模式都當成是變量初始的狀態。當被解釋成整型值時,任何位模式都是合法的值——雖然這個值不可能是程序員想要的。因爲這個值合法,所以使用它也不可能會導致程序崩潰。可能的結果是導致程序錯誤執行和/或錯誤計算。


聲明和定義

變量的定義用於爲變量分配存儲空間,還可以爲變量指定初始值。在一個程序中,變量有且僅有一個定義。 


聲明用於向程序表明變量的類型和名字。定義也是聲明:當定義變量時我們聲明瞭它的類型和名字。可以通過使用 extern 關鍵字聲明變量名而不定義它。不定義變量的聲明包括對象名、對象類型和對象類型前的關鍵字 extern: 

extern int i; // declares but does not define i 
int i; // declares and defines i 
extern 聲明不是定義,也不分配存儲空間。事實上,它只是說明變量定義在程序的其他地方。程序中變量可以聲明多次,但只能定義一次。



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