你可能覺得這個“Hellow World”程序用處不大。我們寫了好幾行代碼,編譯,然後執行生成的程序只是為了在屏幕上看到一句話。的確,我們直接在屏幕上打出這句話會更快。但是編程並不僅限於在屏幕上打出文字這麼簡單的工作。為了能夠進一步寫出可以執行更有用的任務的程序,我們需要引入變量(variable)這個的概念。
讓我們設想這樣一個例子,我要求你在腦子裡記住5這個數字,然後再記住2這個數字。你已經存儲了兩個數值在你的記憶裡。現在我要求你在我說的第一個數值上加1,你應該保留6 (即5+1)和2在你的記憶裡。現在如果我們將兩數相減可以得到結果4。
所有這些你在腦子裡做的事情與計算機用兩個變量可以做的事情非常相似。同樣的處理過程用C++來表示可以寫成下面一段代碼:
a = 5;
很明顯這是一個很簡單的例子,因為我們只用了兩個小的整數數值。但是想一想你的電腦可以同時存儲成千上萬這樣的數值,並進行復雜的數學運算。
因此,我們可以將變量(variable)定義為內存的一部分,用以存儲一個確定的值。
每一個變量 (variable)需要一個標識,以便將它與其他變量相區別,例如,在前面的代碼中,變量標識是a, b,和result。我們可以給變量起任何名字,只要它們是有效的標識符。
有效標識由字母(letter),數字(digits)和下劃線 ( _ )組成。標識的長度沒有限制,但是有些編譯器只取前32個字符(剩下的字符會被忽略)。
空格(spaces),標點(punctuation marks)和符號(symbols) 都不可以出現在標識中。 只有字母(letters),數字(digits) 和下劃線(_)是合法的。並且變量標識必須以字母開頭。標識也可能以下劃線(_)開頭,但這種標識通常是保留給為外部連接用的。標識不可以以數字開頭。
必須注意的另一條規則是當你給變量起名字時不可以和C++語言的關鍵字或你所使用的編譯器的特殊關鍵字同名,因為這樣與這些關鍵字產生混淆。例如,以下列出標准保留關鍵字,他們不允許被用作變量標識名稱:
asm, auto, bool, break, case, catch, char, class, const, const_cast, continue, default, delete, do, double, dynamic_cast, else, enum, explicit, extern, false, float, for, friend, goto, if, inline, int, long, mutable, namespace, new, operator, private, protected, public, register, reinterpret_cast, return, short, signed, sizeof, static, static_cast, struct, switch, template, this, throw, true, try, typedef, typeid, typename, union, unsigned, using, virtual, void, volatile, wchar_t, while
另外,不要使用一些操作符的替代表示作為變量標識,因為在某些環境中它們可能被用作保留詞:
and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq
你的編譯器還可能包含一些特殊保留詞,例如許多生成16位碼的編譯器(比如一些DOS編譯器)把 far, huge和 near也作為關鍵字。
非常重要:C++語言是“ 大小寫敏感”(“case sensitive”) 的,即同樣的名字字母大小寫不同代表不同的變量標識。因此,例如變量RESULT,變量result和變量Result分別表示三個不同的變量標識.
編程時我們將變量存儲在計算機的內存中,但是計算機要知道我們要用這些變量存儲什麼樣的值,因為一個簡單的數值,一個字符,或一個巨大的數值在內存所占用的空間是不一樣的。
計算機的內存是以字節(byte)為單位組織的。一個字節(byte)是我們在C++中能夠操作的最小的內存單位。一個字節(byte)可以存儲相對較小數據:一個單個的字符或一個小整數(通常為一個0到255之間的整數)。但是計算機可以同時操作處理由多個字節組成復雜數據類型,比如長整數(long integers)和小數(decimals)。以下列表總結了現有的C++基本數據類型,以及每一類型所能存儲的數據范圍:
數據類型(DATA TYPES)
*字節數一列和范圍一列可能根據程序編譯和運行的系統不同而有所不同。這裡列出的數值是多數32位系統的常用數據。對於其他系統,通常的說法是整型(int)具有根據系統結構建議的自然長度(即一個字one word的長度),而4中整型數據char, short, int, long的長度必須是遞增的,也就是說按順序每一類型必須大於等於其前面一個類型的長度。同樣的規則也適用於浮點數類型float, double和 long double,也是按遞增順序。
除以上列出的基本數據類型外,還有指針(pointer)和void 參數表示類型,我們將在後面看到。
在C++中要使用一個變量必須先聲明(declare)該變量的數據類型。聲明一個新變量的語法是寫出數據類型標識符(例如int, short, float...) 後面跟一個有效的變量標識名稱。例如:
int a;以上兩個均為有效的變量聲明(variable declaration)。第一個聲明一個標識為a 的整型變量(int variable),第二個聲明一個標識為mynumber 的浮點型變量(float variable)。聲明之後,我們就可以在後面的程序中使用變量a和 mynumber 了。
如果你需要聲明多個同一類型的變量,你可以將它們縮寫在同一行聲明中,在標識之間用逗號(comma) 分隔。例如:
int a, b, c;以上語句同時定義了a、b、c 3個整型變量,它與下面的寫法完全等同:
int a;整型數據類型 (char, short, long 和 int) 可以是有符號的(signed)或無符號的(unsigned ),這取決於我們需要表示的數據范圍。有符號類型(signed)可以表示正數和負數,而無符號類型(unsigned)只能表示正數和0。在定義一個整型數據變量時可以在數據類型前面加關鍵字 signed 或 unsigned 來聲明數據的符號類型。例如:
unsigned short NumberOfSons;如果我們沒有特別寫出signed或 unsigned,變量默認為signed,因此以上第二個聲明我們也可以寫成:
int MyAccountBalance;因為以上兩種表示方式意義完全一樣,因此我們在源程序通常省略關鍵字signed 。
唯一的例外是字符型(char)變量,這種變量獨立存在,與signed char 和 unsigned char型均不相同。
short 和 long 可以被單獨用來表示整型基本數據類型,short 相當於 short int, long 相當於 long int。也就是說 short year; 和 short int year; 兩種聲明是等價的。
最後,signed 和 unsigned 也可以被單獨用來表示簡單類型,意思分別同signed int 和 unsigned int 相同,即以下兩種聲明互相等同:
unsigned MyBirthYear;下面我們就用C++代碼來解決在這一節開頭提到的記憶問題,來看一下變量定義是如何在程序中起作用的。
// operating with variables如果以上程序中變量聲明部分有你不熟悉的地方,不用擔心,我們在後面的章節中很快會學到這些內容。
所有我們要使用的變量都必須事先聲明過。C和C++語言的一個重要區別是,在C++語言中我們可以在源程序中任何地方聲明變量,甚至可以在兩個可執行(excutable)語句的中間聲明變量,而不象在C語言中變量聲明只能在程序的開頭部分。
然而,我們還是建議在一定程度上遵循C語言的習慣來聲明變量,因為將變量聲明放在一處對debug程序有好處。因此,傳統的C語言方式的變量聲明就是把變量聲明放在每一個函數(function)的開頭(對本地變量local variable)或直接放在程序開頭所有函數(function)的外面(對全局變量global variable)。
一個變量可以是本地(local)范圍內有效,叫做本地變量,也可以是全局(global)范圍內有效,叫做全局變量。全局變量要定義在一個源碼文件的主體中,所有函數(包括主函數main())之外。而本地變量定義在一個函數甚至只是一個語句塊單元中。如下圖所示:
全局變量Global variables可以在程序中任何地方任何函數(function)中被引用,只要是在變量的聲明之後。
本地變量local variables的作用范圍被局限在聲明它的程序范圍內。如果它們是在一個函數的開頭被聲明的(例如main函數),它們的作用范圍就是整個main函數。在左圖的例子中,這就意味著如果在main函數外還另有一個函數,main函數中聲明的本地變量(Age, ANumber, AnotherOne) 不能夠被另一個函數使用,反之亦然。
在C++中,本地變量(local variable)的作用范圍被定義在聲明它的程序塊內(一個程序塊是被一對花括號(curly brackets{})括起來的一組語句)。如果變量是在一個函數(function)中被聲明的,那麼它是一個函數范圍內的變量,如果變量是在一個循環中(loop)中被聲明的,那麼它的作用范圍只是在這個循環(loop)之中,以此類推。
除本地和全局范圍外,還有一種外部范圍,它使得一個變量不僅在同一源程序文件中可見,而且在其他所有將被鏈接在一起的源文件中均可見。
當一個本地變量( local variable)被聲明時,它的值默認為未定(undetermined)。但你可能希望在聲明變量的同時賦給它一個具體的值。要想達到這個目的,需要對變量進行初始化。C++中有兩種初始化方法:
第一種,又叫做類C (c-like) 方法,是在聲明變量的時候加上一個等於號,並在後面跟上想要的數值:
type identifier = initial_value ;例如,如果我們想聲明一個叫做a的int變量並同時賦予它0這個值,我們可以這樣寫:
int a = 0;另外一種變量初始化的方法,又叫做構造函數(constructor)初始化, 是將初始值用小括號(parenthesis ())括起來:
type identifier (initial_value) ;例如:
int a (0);在C++.中以上兩種方法都正確並且兩者等同 。
// 變量初始化 #include6using namespace std; int main () { int a=5; // 初始值為 5 int b(2); // 初始值為 2 int result; // 不確定初始值 a = a + 3; result = a - b; cout << result; return 0; }
字符串是用來存儲一個以上字符的非數字值的變量。
C++提供一個string類來支持字符串的操作,它不是一個基本的數據類型,但是在一般的使用中與基本數據類型非常相似。
與普通數據類型不同的一點是,要想聲明和使用字符串類型的變量,需要引用頭文件
// C++字符串例題 #include#include usingnamespace std; int main () { string mystring = "This is a string"; cout << mystring; return 0; }
This is a string
如上面例子所示,字符串變量可以被初始化為任何字符串值,就像數字類型變量可以被初始化為任何數字值一樣。
以下兩種初始化格式對字符串變量都是可以使用的:
string mystring = "This is a string"; string mystring ("This is a string");
字符串變量還可以進行其他與基本數據類型變量一樣的操作,比如聲明的時候不指定初始值,和在運行過程中被重新賦值。
// C++字符串例題2 #include#include using namespace std; int main () { string mystring; mystring = "This is the initial string content"; cout << mystring << endl; mystring = "This is a different string content"; cout << mystring << endl; return 0; }
This is the initial string content This is a different string content