1. 程式人生 > >C++基礎知識(二)—— 變數和資料型別

C++基礎知識(二)—— 變數和資料型別

你可能覺得這個“Hellow World”程式用處不大。我們寫了好幾行程式碼,編譯,然後執行生成的程式只是為了在螢幕上看到一句話。的確,我們直接在螢幕上打出這句話會更快。但是程式設計並不僅限於在螢幕上打出文字這麼簡單的工作。為了能夠進一步寫出可以執行更有用的任務的程式,我們需要引入變數(variable)這個的概念。

讓我們設想這樣一個例子,我要求你在腦子裡記住5這個數字,然後再記住2這個數字。你已經儲存了兩個數值在你的記憶裡。現在我要求你在我說的第一個數值上加1,你應該保留6 (即5+1)和2在你的記憶裡。現在如果我們將兩數相減可以得到結果4。

所有這些你在腦子裡做的事情與計算機用兩個變數可以做的事情非常相似。同樣的處理過程用C++來表示可以寫成下面一段程式碼:

a = 5;
b = 2;
a = a + 1;
result = a - b;

很明顯這是一個很簡單的例子,因為我們只用了兩個小的整數數值。但是想一想你的電腦可以同時儲存成千上萬這樣的數值,並進行復雜的數學運算。

因此,我們可以將變數(variable)定義為記憶體的一部分,用以儲存一個確定的值。

每一個變數 (variable)需要一個標識,以便將它與其他變數相區別,例如,在前面的程式碼中,變數標識是a, b, 和result。我們可以給變數起任何名字,只要它們是有效的識別符號。

標識(Identifiers)

有效標識由字母(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分別表示三個不同的變數標識.

基本資料型別(Fundamental Data types)

程式設計時我們將變數儲存在計算機的記憶體中,但是計算機要知道我們要用這些變數儲存什麼樣的值,因為一個簡單的數值,一個字元,或一個巨大的數值在記憶體所佔用的空間是不一樣的。

計算機的記憶體是以位元組(byte)為單位組織的。一個位元組(byte)是我們在C++中能夠操作的最小的記憶體單位。一個位元組(byte)可以儲存相對較小資料:一個單個的字元或一個小整數(通常為一個0到255之間的整數)。但是計算機可以同時操作處理由多個位元組組成複雜資料型別,比如長整數(long integers)和小數(decimals)。以下列表總結了現有的C++基本資料型別,以及每一型別所能儲存的資料範圍:

資料型別(DATA TYPES)

名稱 位元組數* 描述 範圍*
char 1 字元(character)或整數(integer ), 8位(bits)長 有符號(signed): -128 到 127
無符號(unsigned): 0 到 255
short int (short)
2 短整數(integer )16位(bits)長 有符號(signed): -32768 到 32767
無符號(unsigned): 0 到 65535
long int (long)
4 長整數(integer )32位(bits)長 有符號(signed):-2147483648 到 2147483647
無符號(unsigned): 0 到 4294967295
int 4 整數(integer) 有符號(signed): -2147483648 到 2147483647
無符號(unsigned): 
0 到 4294967295 
float 4 浮點數(floating point number) 3.4e + / - 38 (7 個數字(7digits))
double 8 雙精度浮點數(double precision floating point number) 1.7e + / - 308 (15 digits)
long double 8 長雙精度浮點數(long double precision floating point number) 1.7e + / - 308 (15 digits)
bool 1 布林Boolean值。它只能是真(true)或假(false)兩值之一。 true 或 false
wchar_t 2 寬字元(Wide character) 。這是為儲存兩位元組(2 bytes) 長的國際字元而設計的型別。 一個寬字元(1 wide characters)

* 位元組數一列和範圍一列可能根據程式編譯和執行的系統不同而有所不同。這裡列出的數值是多數32位系統的常用資料。對於其他系統,通常的說法是整型(int)具有根據系統結構建議的自然長度(即一個字one word的長度),而4中整型資料char, short, int, long的長度必須是遞增的,也就是說按順序每一型別必須大於等於其前面一個型別的長度。同樣的規則也適用於浮點數型別float, double和 long double,也是按遞增順序。

除以上列出的基本資料型別外,還有指標(pointer)和void 引數表示型別,我們將在後面看到。

變數的宣告(Declaration of variables)

在C++中要使用一個變數必須先宣告(declare)該變數的資料型別。宣告一個新變數的語法是寫出資料型別識別符號(例如int, short, float...) 後面跟一個有效的變數標識名稱。例如:

int a;
float mynumber;

以上兩個均為有效的變數宣告(variable declaration)。第一個宣告一個標識為a 的整型變數(int variable),第二個宣告一個標識為mynumber 的浮點型變數(float variable)。宣告之後,我們就可以在後面的程式中使用變數a和 mynumber 了。

如果你需要宣告多個同一型別的變數,你可以將它們縮寫在同一行宣告中,在標識之間用逗號(comma) 分隔。例如:

int a, b, c;

以上語句同時定義了a、b、c 3個整型變數,它與下面的寫法完全等同:

int a;
int b;
int c;

整型資料型別 (char, short, long 和 int) 可以是有符號的(signed)或無符號的(unsigned ),這取決於我們需要表示的資料範圍。有符號型別(signed)可以表示正數和負數,而無符號型別(unsigned)只能表示正數和0。在定義一個整型資料變數時可以在資料型別前面加關鍵字 signed 或 unsigned 來宣告資料的符號型別。例如:

unsigned short NumberOfSons;
signed int MyAccountBalance;

如果我們沒有特別寫出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;
unsigned int MyBirthYear;

下面我們就用C++程式碼來解決在這一節開頭提到的記憶問題,來看一下變數定義是如何在程式中起作用的。

// operating with variables

#include <iostream.h>
using namespace std;

int main ()
{
    // declaring variables:
    int a, b;
    int result;

    // process:
    a = 5;
    b = 2;
    a = a + 1;
    result = a - b;

    // print out the result:
    cout << result;

    // terminate the program:
    return 0;
}
4

如果以上程式中變數宣告部分有你不熟悉的地方,不用擔心,我們在後面的章節中很快會學到這些內容。


變數的範圍(Scope of 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)之中,以此類推。

除本地和全域性範圍外,還有一種外部範圍,它使得一個變數不僅在同一源程式檔案中可見,而且在其他所有將被連結在一起的原始檔中均可見。

變數初始化(Initialization of variables)

當一個本地變數( 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++.中以上兩種方法都正確並且兩者等同 。

// 變數初始化

#include <iostream>
using namespace std;

int main ()
{
  int a=5;    // 初始值為 5
  int b(2);   // 初始值為 2
  int result; // 不確定初始值

  a = a + 3;
  result = a - b;
  cout << result;

  return 0;
}

6

字串 (strings)

字串是用來儲存一個以上字元的非數字值的變數。

C++提供一個string類來支援字串的操作,它不是一個基本的資料型別,但是在一般的使用中與基本資料型別非常相似。

與普通資料型別不同的一點是,要想宣告和使用字串型別的變數,需要引用標頭檔案<string>,並且使用using namespace語句來使用標準名空間(std),如下面例子所示:

// C++字串例題
#include <iostream>
#include <string>
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 <iostream>
#include <string> 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

要了解更加詳細的C++字串操作,建議參考Cplusplus上的string類reference