關於C++中常量的理解

關於C++中常量的理解


一 常量的分類

在C++中,常量是區分類型的,從字面形式即可識別其類型。


整型常量(整數)的類型
在上一節中已知道:整型數據可分爲int, short int,long int以及unsigned int, unsigned short, unsigned long等類別。整型常量也分爲以上類別。爲什麼將數值常量區分爲不同的類別呢?因爲在進行賦值或函數的參數虛實結合時要求數據類型匹配。

浮點數的表示方法

一個浮點數可以用兩種不同的方式表示:
1) 十進制小數形式。如21.456, -7.98等。它一般由整數部分和小數部分組成,可以省略其中之一(如78.或.06, .0),但不能二者皆省略。C++編譯系統把用這種形式表示的浮點數一律按雙精度常量處理,在內存中佔8個字節。如果在實數的數字之後加字母F或f,表示此數爲單精度浮點數,如1234F, -43f,佔4個字節。如果加字母L或l,表示此數爲長雙精度數(long double),在GCC中佔12個字節,在Visual C++ 6.0中佔8個字節。

2) 指數形式(即浮點形式)。一個浮點數可以寫成指數形式,如3.14159可以表示爲0.314159×101, 3.14159×100, 31.4159×10-1, 314.159×10-2等形式。在程序中應表示爲:0.314159e1, 3.14159e0, 31.4159e-1, 314.159e-2,用字母e表示其後的數是以10爲底的冪,如e12表示1012。其一般形式爲:
    數符  數字部分  指數部分

上面各數據中的0.314159, 3.14159, 31.4159, 314.159 等就是其中的數字部分。可以看到:由於指數部分的存在,使得同一個浮點數可以用不同的指數形式來表示,數字部分中小數點的位置是浮動的。例如:
    a=0.314159e1;
    a=3.14159e0;
    a=31.4159e-1;
    a=314.159e-2;
以上4個賦值語句中,用了不同形式的浮點數,但其作用是相同的。

在程序中不論把浮點數寫成小數形式還是指數形式,在內存中都是以指數形式(即浮點形式)存儲的。例如不論在程序中寫成314.159或314.159e0, 31.4159e1, 3.14159e2, 0.314159e3等形式,在內存中都是以規範化的指數形式存放,如圖2.3所示。


圖 2.3
 

數字部分必須小於1,同時,小數點後面第一個數字必須是一個非0數字,例如不能是0.0314159。因此314.159和314.159e0, 31.4159e1, 3.14159e2, 0.314159e3在內存中表示成0.314159×103。存儲單元分爲兩部分,一部分用來存放數字部分,一部分用來存放指數部分。爲便於理解,在圖2.3中是用十進制表示的,實際上在存儲單元中是用二進制數來表示小數部分,用2的冪次來表示指數部分的。

對於以指數形式表示的數值常量,也都作爲雙精度常量處理。

字符常量

1) 普通的字符常量
用單引號括起來的一個字符就是字符型常量。如'a', '#', '%', 'D'都是合法的字符常量,在內存中佔一個字節。注意:
  • 字符常量只能包括一個字符,如'AB' 是不合法的。
  • 字符常量區分大小寫字母,如'A'和'a'是兩個不同的字符常量。
  • 撇號(')是定界符,而不屬於字符常量的一部分。如cout<<'a';輸出的是一個字母"a",而不是3個字符"'a' "。


3) 字符數據在內存中的存儲形式及其使用方法
將一個字符常量存放到內存單元時,實際上並不是把該字符本身放到內存單元中去,而是將該字符相應的ASCII代碼放到存儲單元中。如果字符變量c1的值爲'a',c2的值爲'b',則在變量中存放的是'a'的ASCII碼97,'b' 的ASCII碼98,如圖2.4(a)所示,實際上在內存中是以二進制形式存放的,如圖2.4(b)所示。

 

圖 2.4

既然字符數據是以ASCII碼存儲的,它的存儲形式就與整數的存儲形式類似。這樣,在C++中字符型數據和整型數據之間就可以通用。一個字符數據可以賦給一個整型變量,反之,一個整型數據也可以賦給一個字符變量。也可以對字符數據進行算術運算,此時相當於對它們的ASCII碼進行算術運算


字符串常量

用雙撇號括起來的部分就是字符串常量,如"abc","Hello!","a+b","Li ping"都是字符串常量。字符串常量"abc"在內存中佔4個字節(而不是3個字節),見圖2.5。

 

圖 2.5

編譯系統會在字符串最後自動加一個'\0'作爲字符串結束標誌。但'\0'並不是字符串的一部分,它只作爲字符串的結束標誌。如
   cout<<"abc"<<endl;
輸出3個字符abc,而不包括'\0'。

注意: "a"和'a'代表不同的含義,"a"是字符串常量,'a' 是字符常量。前者佔兩個字節,後者佔1個字節。請分析下面的程序片段:
    char c;  //定義一個字符變量
    c='a';  //正確
    c="a";  //錯誤,c只能容納一個字符

請思考:字符串常量"abc\n"包含幾個字符?不是5個而是4個字符,其中"\n"是一個轉義字符。但它在內存中佔5個字節(包括一個"\0"字符) 。編譯系統遇到"\"時就會把它認作轉義字符的標誌,把它和其後的字符一起作爲一個轉義字符。



符號常量

爲了編程和閱讀的方便,在C++程序設計中,常用一個符號名代表一個常量,稱爲符號常量,即以標識符形式出現的常量。

【例2.3】符號常量的使用。
  1. #include <iostream>
  2. using namespace std;
  3. #define PRICE 30 //注意這不是語句,末尾不要加分號
  4. int main ( )
  5. {
  6. int num,total;
  7. num=10;
  8. total=num * PRICE;
  9. cout<<"total="<<total<<endl;
  10. return 0;
  11. }
程序中用預處理命令#define指定PRICE在本程序單位中代表常量30,此後凡在本程序單位中出現的PRICE都代表30,可以和常量一樣進行運算,程序運行結果爲
    total=300
請注意符號常量雖然有名字,但它不是變量。它的值在其作用域(在本例中爲主函數)內是不能改變的,也不能被賦值。如用賦值語句"PRICE=40;"給PRICE賦值是錯誤的。 使用符號常量的好處是:含義清楚,在需要改變一個常量時能做到"一改全改"。 如:
    #define PRICE 35

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