1. 程式人生 > >C++學習之資料型別—常量

C++學習之資料型別—常量

C++常量分為以下字面常量、符號常量、契約性常量、布林常量和列舉常量,讓我們一起來看看這些常量的用法以及特點。

字面常量:

       1、整形字面常量

       例如 10,057,0xf7,表示方法可以有八進位制,十進位制,十六進位制。預設的型別為int或者long行,根據字面值的大小來判斷。可以通過加入字尾L或者l來強制轉換為long型別,又可以加字尾U或者u來強制轉換為unsigned型別,例如1024UL為unsigned long型別。

      2、浮點字面值常量

      可以用十進位制,例如3.14或者科學計數法3.12E2來表示,預設的浮點字面值為double型別,在數值後面加上F或者f表示單精度,加上L或者l表示long double型別。

      3、字元常量

      可列印字元,直接加單引號表示,例如 ‘a’,‘2’;不可列印字元,例如退格鍵,用轉義字元表示,例如換行符‘\n',回車符'\r'等等。

      4、字串常量

      例如“hello”,“”,兩個相鄰的僅由空格、製表符和換行符分開的字串字面值,可以連線成一個新的字串字面值。例如

      std::out<<"welcome "

                      "to "

                      "C++ world!"<<endl; 

      將會輸出:welcome to C++ world!

     還有一種方法可以連線多行字面值,在一行程式的末尾加一個反斜槓號可以將此行和下一行當做同一行處理。例如

      co\
     ut<<"abc\
        def"<<endl;

    此處,輸出abc  def。值得注意的是,反斜槓號必須是該行的尾字元,同樣,後繼行行首的任何空格和和製表符都是該字串字面值的一部分。

    另外,值得一提的是,除了字串常量之外,無法獲取一個字面常量的地址,例如,我們可以char* pa="abc",但是int *p=&3 這樣寫是錯誤的

符號常量:

   存在兩種符號常量,由#define定義的巨集常量和const定義的常量。由#define定義的巨集常量是預編譯偽指令,在進入編譯階段之前就已經替換成了字面常量,所以,巨集常量本質上是字面常量;而由const定義的常量則更為靈活,需分情況對待。

   1、const全域性常量

   此時編譯器將該常量放置於符號表中,不需要分配儲存空間。任何對該常量的修改都將失敗,見下例

  

    此處,編譯連結沒有出錯,但執行的時候不能通過。

   2、const區域性常量

  

    此處輸出,100和1。對此,《C++ primer》上的解釋是對於基本型別的const常量,編譯器會重新在記憶體中建立一個它的拷貝,通過其地址訪問的是它的拷貝而非原始的符號常量。