數值常量
數值常量就是通常所說的常數。在C++中,數值常量是區分類型的,從字面形式即可識別其類型。一個整數,如果其值在-32768~+32767范圍內,認為它是short int型,它可以賦值給short int型、int型和long int型變量。
一個整數,如果其值超過了上述范圍,而在-2147483648~+2147483647范圍內,則認為它是long int型,可以將它賦值給一個int或long int型變量。
如果某一計算機系統的C++版本(例如Visual C++)確定int與long int型數據在內存中占據的長度相同,則它們能夠表示的數值的范圍相同。因此,一個int型的常量也同時是一個long int型常量,可以賦給int型或long int型變量。
常量無unsigned型。但一個非負值的整數可以賦值給unsigned整型變量,只要它的范圍不超過變量的取值范圍即可。
十進制整數。如1357, -432, 0等。在一個整型常量後面加一個字母l或L,則認為是long int型常量。例如123L, 421L, 0L等,這往往用於函數調用中。如果函數的形參為long int,則要求實參也為long int型,此時用123作實參不行,而要用123L作實參。
八進制整數。在常數的開頭加一個數字0,就表示這是以八進制數形式表示的常數。如020表示這是八進制數20,即(20)8,它相當於十進制數16。
十六進制整數。在常數的開頭加一個數字0和一個英文字母X(或x),就表示這是以十六進制數形式表示的常數。如0X20表示這是十六進制數20,即(20)16,它相當於十進制數32。
浮點數的表示方法在程序中不論把浮點數寫成小數形式還是指數形式,在內存中都是以指數形式(即浮點形式)存儲的。例如不論在程序中寫成314.159或314.159e0, 31.4159e1, 3.14159e2, 0.314159e3等形式,在內存中都是以規范化的指數形式存放,如圖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' "。
2) 轉義字符常量
除了以上形式的字符常量外,C++還允許用一種特殊形式的字符常量,就是以 "\"開頭的字符序列。例如,'\n'代表一個"換行"符。"cout<<'\n'; " 將輸出一個換行,其作用與"cout<<endl; " 相同。這種"控制字符",在屏幕上是不能顯示的。在程序中也無法用一個一般形式的字符表示,只能采用特殊形式來表示。
3) 字符數據在內存中的存儲形式及其使用方法
將一個字符常量存放到內存單元時,實際上並不是把該字符本身放到內存單元中去,而是將該字符相應的ASCII代碼放到存儲單元中。如果字符變量c1的值為'a',c2的值為'b',則在變量中存放的是'a'的ASCII碼97,'b' 的ASCII碼98,如圖2.4(a)所示,實際上在內存中是以二進制形式存放的,如圖2.4(b)所示。
既然字符數據是以ASCII碼存儲的,它的存儲形式就與整數的存儲形式類似。這樣,在C++中字符型數據和整型數據之間就可以通用。一個字符數據可以賦給一個整型變量,反之,一個整型數據也可以賦給一個字符變量。也可以對字符數據進行算術運算,此時相當於對它們的ASCII碼進行算術運算。
【例2.1】將字符賦給整型變量。
執行時輸出:
65 66
i和j被指定為整型變量。但在第5和第6行中,將字符'A'和'B'分別賦給i和j,它的作用相當於以下兩個賦值語句:
i=65;j=66;
因為'A'和'B'的ASCII碼為65和66。在程序的第5和第6行是把65和66直接存放到i和j的內存單元中。因此輸出65和66。
可以看到:在一定條件下,字符型數據和整型數據是可以通用的。但是應注意字符數據只占一個字節,它只能存放0~255范圍內的整數。
【例2.2】字符數據與整數進行算術運算。下面程序的作用是將小寫字母轉換為大寫字母。
運行結果為:
A B
'a'的ASCII碼為97,而'A'的ASCII碼為65,'b'為98,'B'為66。從ASCII代碼表中可以看到每一個小寫字母比它相應的大寫字母的ASCII代碼大32。C++符數據與數值直接進行算術運算,'a'-32得到整數65,'b'-32得到整數66。將65和66存放在c1,c2中,由於c1,c2是字符變量,因此用cout輸出c1,c2時,得到字符A和B(A的ASCII碼為65,B的ASCII碼為66)。
字符串常量
用雙撇號括起來的部分就是字符串常量,如"abc","Hello!","a+b","Li ping"都是字符串常量。字符串常量"abc"在內存中占4個字節(而不是3個字節),見圖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"),則在編譯時顯示出錯信息。如果希望將"\"字符也作為字符串中的一個字符,則應寫為"abc\\n",此時字符包括5個字符,即a,b,c,\,n。如果有以下輸出語句:
cout<<"abc\\\n"<<endl;
則會輸出:
abc\ (然後換行)
同理執行
cout<<"I say \"Thank you!\"\n";
的輸出是:
I say "Thank you!"
如果在一個字符串中最後一個字符為"\",則表示它是續行符,下一行的字符是該字符串的一部分,且在兩行字符串間無空格。如
cout<<"We must study C\ //本行最後的"\"後面的空格和換行均不起作用
++ hard!"; //本行的字符緊連在上一行最後的"\"前面字符之後
則輸出:
We must study C++ hard!
符號常量
為了編程和閱讀的方便,在C++程序設計中,常用一個符號名代表一個常量,稱為符號常量,即以標識符形式出現的常量。
【例2.3】符號常量的使用。
程序中用預處理命令#define指定PRICE在本程序單位中代表常量30,此後凡在本程序單位中出現的PRICE都代表30,可以和常量一樣進行運算,程序運行結果為:
total=300
請注意符號常量雖然有名字,但它不是變量。它的值在其作用域(在本例中為主函數)內是不能改變的,也不能被賦值。如用賦值語句"PRICE=40;"給PRICE賦值是錯誤的。 使用符號常量的好處是:含義清楚,在需要改變一個常量時能做到"一改全改"。 如:
#define PRICE 35