變量 還是從變量講起來吧。變量(variable)實際上是賦予內存地址的名稱。聲明變量后,就可以用它操作內存中的數據。下面舉幾個例子進行說明。下列碼段用了兩個變量,每條語句末尾用說明語句描述執行該語句時發生的情況: int x;// variable declared as an integer variable x = 100;// 'x' now contains the value 100 x +=50;// 'x' now contains the value 150 int y = 150;// 'y' declared and initialized to 150 x += y;// 'x' now contains the value 300 x++;// 'x' now contains the value 301 新術語 變量(variable)是留作存放某個數值的計算機內存地址。注重x的值在變量操作時會改變,稍后會介紹操作變量的C++操作符。警告 聲明而未初始化的變量包含隨機值。由于變量所指向的內存還沒有初始化,所以不知道該內存地址包含什么值。 例如,下列代碼 int k; int y; x=y+10; //oops! 本例中變量y沒有事先初始化,所以x可能取得任何值。例外的情況是全局變量和用static修飾聲明的變量總是初始化為0。而所有其它變量在初始化或賦值之前包含隨機值。變量名可以混合大寫、小寫字母和數字與下劃線(_),但不能包含空格和其它非凡字符。變量名必須以字母或下劃線開始。一般來說,變量名以下劃線或雙下劃線開始不好。變量名答應的最大長度隨編譯器的不同而不同。假如變量名保持在32個字符以下,則絕對安全。實際中,任何超過20個字符的變量名都是不實用的。 下例是有效變量名的例子: int aVeryLongVariableName;// a long variable name int my_variable;// a variable with an underscore int_ x;// OK,but not advisedint X;// uppercase variable name int Labe12;// a variable name containing a number int GetItemsInContainer(); // thanks Pete! 說明 C++中的變量名是考慮大小寫的,下列變量是不同的:int XPos;int xpos;假如你原先所用語言不考慮大小寫(如Pascal),則開始接觸考慮大小寫的語言可能不太適應。
C++數據類型 新術語 C++數據類型定義編譯器在內存中存放信息的方式。在有些編程語言中,可以向變量賦予任何數值類型。例如,下面是BASIC代碼的例子:x = 1;x = 1000;x = 3.14;x = 457000;在BASIC中,翻譯器能考慮根據數字長度和類型分配空間。而在C++,則必須先聲明變量類型再使用變量:int x1 = 1;int x = 1000;float y = 3.14;long z = 457000;這樣,編譯器就可以進行類型檢查,確保程序運行時一切順利。數據類型使用不當會導致編譯錯誤或警告,以便分析和糾正之后再運行。有些數據類型有帶符號和無符號兩種。帶符號(signed)數據類型可以包含正數和負數,而無符號(unsigned)數據類型只能包含正數。表1.1列出了C++中的數據類型、所要內存量和可能的取值范圍。
表1.1C++數據類型(32位程序) 數據類型 字節 數取值范圍 char 1 -128到126 unsigned char 1 0到255 short 2 -32,768到32,767 unsigned short 2 0到65,535 long 4 -2,147,483,648到2,147,483,648 unsigned long 4 0到4,294,967,295 int 4 同long unsigned int 4 同unsigned long float 4 1.2E-38到3.4E381 double 8 2.2E-308到1.8E3082 bool 1 true或false 從上表可以看出,int與long相同。那么,為什么C++還要區分這兩種數據類型呢?實際上這是個遺留問題。在16位編程環境中,int要求2個字節而long要求4個字節。而在32位編程環境中,這兩種數據都用4個字節存放。C++Builder只生成32位程序,所以int與long相同。說明 在C++ Builder和BorLand C++ 5.0中,Bool是個真正的數據類型。有些C++編譯器有Bool要害字,則Bool不是個真正的數據類型。有時Bool只是個typedef,使Bool等價于int。typedef實際上建立別名,使編譯器在一個符號與另一符號間劃上等號。typedef的語法如下:typedef int Bool;這就告訴編譯器:Bool是int的別名。說明 只有double和float數據類型使用浮點數(帶小數點的數)。其它數據類型只涉及整數值。盡管integer數據類型也可以指定帶小數點的數值,但小數部分會舍棄,只將整數部分賦予整型變量,例如:int x=3.75;得到的x取值為3。注重,這個整數值并不是四舍五入,而是放棄小數部分。順便說一句,大多數Windows程序很少用到浮點數。C++可以在必要時進行不同數據類型間的換算。例如:short result;long num1 = 200;long num2 = 200;result = num1 * num2;這里我想將兩個長整型的積賦予一個短整型。盡管這個公式混用了兩種數據類型,但C++能夠進行換算。計算結果會怎樣呢?結果會讓你大吃一驚,是25536,這是繞接(wrop)的結果。從表1.1可以看出,短整型的最大取值為32767,在最大值之上加1會怎么樣呢?得到的是32768。這實際上與汽車里程計從99999回到00000的道理一樣。為了說明這點,請輸入并運行下列清單1.3中包含的程序。 清單1.3Wrapme.cpp 1: #include <iostream.h> 2: #include <conio.h> 3: #PRagma hdrstop 4: 5: int main(int argc,char **argv) 6: { 7:short x = 32767; 8:cout << " x = " << x << endl; 9:x++; 10: cout << " x = " << x << endl; 11: getch(); 12: return 0; 13: } 說明后面幾節要介紹的有些清單沒有下列語句: #include<condefs.h> C++ Builder生成新的控制臺應用程序時會自動加上這條語句。這在你所用的程序中不是必須的,所以代碼清單中將其省略。無論有無這條語句,程序運行結果是一致的。分析輸出結果為:x=32767 x=32768假如用int數據類型,則不會有這個問題,因為int數據類型的取值范圍在正向20億之間,一般不會有繞回的問題。但這時程序可能會稍大一些,因為int需要4字節存儲,而short只需要2字節存儲。對于大多數應用程序,這個差別是不顯著的。前面介紹了自動類型換算。有時C++無法進行換算,這時可能在編譯器中產生編譯錯誤,說Cannot convert from x to y(無法從x換算到Y)。編譯器也可能警告說Conversion might lose significant digits(換算可能丟失顯著位)。提示 編譯器警告應當作編譯器錯誤,因為它表明出了錯誤。我們應努力生成無警告的編譯。有時警告無法避免,但一定要認真檢查所有警告。應充分了解警告的原因并盡量予以糾正。