• 教程
  • 變數。資料型別。

變數。資料型別。

前一節中展示的“Hello World”程式的用處非常值得懷疑。 我們必須編寫幾行程式碼,編譯它們,然後執行生成的程式,才能在螢幕上獲得一個簡單的句子作為結果。 肯定我們自己輸入輸出語句會更快。 但是,程式設計不僅僅限於在螢幕上列印簡單的文字。 為了更進一步,並且能夠編寫執行真正為我們節省工作量的有用任務的程式,我們需要引入變數的概念。

讓我們假設我要求你在你的心理記憶中保留數字 5,然後我要求你同時記住數字 2。 你剛剛在你的記憶中儲存了兩個不同的值。 現在,如果我要求你給第一個數字加 1,你應該在你的記憶中保留數字 6(即 5+1)和 2。 這些值我們現在可以 - 例如 - 相減並得到 4 作為結果。

你剛剛用你的心理記憶所做的整個過程類似於計算機可以用兩個變數做的事情。 相同的過程可以用 C++ 用以下指令集表達

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

顯然,這是一個非常簡單的例子,因為我們只使用了兩個小的整數值,但請考慮你的計算機可以同時儲存數百萬個像這樣的數字,並對它們進行復雜的數學運算。

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

每個變數都需要一個識別符號來區分它與其他變數。 例如,在前面的程式碼中,變數識別符號abresult,但我們可以隨意為變數命名,只要它們是有效的識別符號。

識別符號

有效識別符號是由一個或多個字母、數字或下劃線字元 (_) 組成的序列。 空格或標點符號或符號都不能成為識別符號的一部分。 只有字母、數字和單個下劃線字元是有效的。 此外,變數識別符號總是必須以字母開頭。 它們也可以以下劃線字元 (_) 開頭,但在某些情況下,這些字元可能被保留用於編譯器特定的關鍵字或外部識別符號,以及包含兩個連續下劃線字元的識別符號。 在任何情況下,它們都不能以數字開頭。

在建立自己的識別符號時,您必須考慮的另一個規則是,它們不能與 C++ 語言的任何關鍵字或您的編譯器的特定關鍵字匹配,這些關鍵字是保留關鍵字。 標準保留關鍵字有

asm, auto, bool, break, case, catch, char, class, const, const_cast, continue, default, delete, do, double, dynamic_cast, else, enum, explicit, export, 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

您的編譯器也可能包含一些額外的特定保留關鍵字。

非常重要:C++ 語言是一種“區分大小寫”的語言。 這意味著以大寫字母書寫的識別符號與另一個具有相同名稱但以小寫字母書寫的識別符號並不等效。 因此,例如,RESULT 變數與 result 變數或 Result 變數不同。 這些是三個不同的變數識別符號。

基本資料型別

程式設計時,我們將變數儲存在計算機的記憶體中,但計算機必須知道我們想要在其中儲存什麼型別的資料,因為它儲存一個簡單的數字與儲存一個字母或一個大數字所佔用的記憶體量不同,並且它們的解釋方式也不同。

我們計算機中的記憶體以位元組為單位組織。 一個位元組是我們可以用 C++ 管理的最小記憶體量。 一個位元組可以儲存相對少量的資料:一個字元或一個小的整數(通常是 0 到 255 之間的整數)。 此外,計算機可以處理更復雜的資料型別,這些資料型別來自對幾個位元組進行分組,例如長數字或非整數數字。

接下來是 C++ 中基本資料型別的摘要,以及每種資料型別可以表示的值的範圍

姓名描述大小*範圍*
char 字元或小整數。 1位元組 signed: -128 到 127
unsigned: 0 到 255
short int (short) 短整數。 2位元組 signed: -32768 到 32767
unsigned: 0 到 65535
int 整數。 4位元組 signed: -2147483648 到 2147483647
unsigned: 0 到 4294967295
long int (long) 長整數。 4位元組 signed: -2147483648 到 2147483647
unsigned: 0 到 4294967295
bool 布林值。 它可以取兩個值之一:true 或 false。 1位元組 truefalse
float 浮點數。 4位元組 +/- 3.4e +/- 38 (~7 位數字)
double 雙精度浮點數。 8位元組 +/- 1.7e +/- 308 (~15 位數字)
long double 長雙精度浮點數。 8位元組 +/- 1.7e +/- 308 (~15 位數字)
wchar_t 寬字元。 2 4 位元組 1 個寬字元

* 列大小範圍的值取決於程式編譯的系統。 上面顯示的值是在大多數 32 位系統上找到的值。 但對於其他系統,一般規範是 int 具有系統架構建議的自然大小(一個“字”),並且四種整數型別 charshortintlong 中的每一種都必須至少與其前一個一樣大,其中 char 始終是一個位元組大小。 同樣適用於浮點型別 floatdoublelong double,其中每一種都必須提供至少與其前一種一樣多的精度。

變數的宣告

為了在 C++ 中使用變數,我們必須首先宣告它,指定我們希望它成為哪種資料型別。 宣告新變數的語法是編寫所需資料型別的說明符(如 int、bool、float...),後跟一個有效的變數識別符號。 例如

1
2
int a;
float mynumber;

這是兩個有效的變數宣告。 第一個宣告一個型別為 int 的變數,其識別符號為 a。 第二個宣告一個型別為 float 的變數,其識別符號為 mynumber。 聲明後,變數 amynumber 可以在程式中的其餘作用域內使用。

如果您要宣告多個相同型別的變數,您可以透過用逗號分隔它們的識別符號,在單個語句中宣告所有變數。 例如

1
int a, b, c;

這聲明瞭三個變數(abc),它們都是型別 int,並且具有與以下程式碼完全相同的含義

1
2
3
int a;
int b;
int c;

整數資料型別 charshortlongint 可以是有符號的或無符號的,具體取決於需要表示的數字範圍。 有符號型別可以表示正值和負值,而無符號型別只能表示正值(和零)。 這可以透過在型別名稱之前使用說明符 signed 或說明符 unsigned 來指定。 例如

1
2
unsigned short int NumberOfSisters;
signed int MyAccountBalance;

預設情況下,如果我們不指定 signedunsigned,大多數編譯器設定將假定該型別為有符號型別,因此我們可以編寫以下程式碼來代替上面的第二個宣告

1
int MyAccountBalance;

具有完全相同的含義(有或沒有關鍵字 signed

此一般規則的一個例外是 char 型別,它本身存在,並且被認為是與 signed charunsigned char 不同的基本資料型別,但用於儲存字元。 如果您打算在 char 大小的變數中儲存數值,則應使用 signedunsigned

shortlong 可以單獨用作型別說明符。 在這種情況下,它們指的是它們各自的整數基本型別:short 等同於 short intlong 等同於 long int。 以下兩個變數宣告是等效的

1
2
short Year;
short int Year;

最後,signedunsigned 也可以用作獨立的型別說明符,含義與 signed intunsigned int 分別相同。 以下兩個宣告是等效的

1
2
unsigned NextYear;
unsigned int NextYear;

要檢視變數宣告在程式中的實際效果,我們將看到本節開頭提出的關於您的心理記憶的示例的 C++ 程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// operating with variables

#include <iostream>
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

如果除了變數宣告本身之外的其他內容對您來說有點陌生,請不要擔心。 您將在後面的章節中詳細瞭解其餘部分。

變數的作用域

我們打算在程式中使用的所有變數必須在程式碼的早期點使用其型別說明符進行宣告,就像我們在前面的程式碼中在函式 main 的主體開頭宣告 abresult 是型別 int 時所做的那樣。

變數可以是全域性作用域或區域性作用域。 全域性變數是在原始碼的主體中宣告的變數,位於所有函式之外,而區域性變數是在函式或塊的主體中宣告的變數。


全域性變數可以在程式碼中的任何位置引用,甚至在函式內部,只要它在宣告之後。

區域性變數的作用域僅限於宣告它們的括號 ({}) 括起來的塊。 例如,如果在函式主體(如函式 main)的開頭宣告它們,則它們的作用域在宣告點和該函式的結尾之間。 在上面的示例中,這意味著如果除了 main 之外還存在另一個函式,則無法從其他函式訪問在 main 中宣告的區域性變數,反之亦然。

變數的初始化

宣告常規區域性變數時,其值預設是不確定的。 但是您可能希望變數在宣告的同時儲存一個具體的值。 為了做到這一點,你可以初始化變數。 在 C++ 中有兩種方法可以做到這一點

第一個,被稱為c 式初始化,是透過附加一個等號,後跟將變數初始化的值來完成的

type identifier = initial_value ;
例如,如果我們要宣告一個 int 變數,稱為 a,並在宣告時用值 0 初始化,我們可以寫

1
int a = 0;

另一種初始化變數的方式,被稱為建構函式初始化,是透過將初始值括在括號 (()) 之間來完成的

type identifier (initial_value) ;
例如:

1
int a (0);

這兩種初始化變數的方式在 C++ 中都是有效且等效的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// initialization of variables

#include <iostream>
using namespace std;

int main ()
{
  int a=5;               // initial value = 5
  int b(2);              // initial value = 2
  int result;            // initial value undetermined

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

  return 0;
}
6

字串簡介

可以儲存比單個字元更長的非數值的變數稱為字串。

C++ 語言庫透過標準 string 類提供對字串的支援。 這不是基本型別,但在其最基本用法中,它的行為方式與基本型別類似。

與基本資料型別的第一個區別是,為了宣告和使用此型別的物件(變數),我們需要在我們的原始碼中包含一個額外的標頭檔案:<string> 並且有權訪問 std 名稱空間(這已經在我們之前的所有程式中,這要歸功於 using namespace 語句)。

// my first string
#include <iostream>
#include <string>
using namespace std;

int main ()
{
  string mystring = "This is a string";
  cout << mystring;
  return 0;
}
This is a string

正如您可能在前面的示例中看到的那樣,字串可以用任何有效的字串文字初始化,就像數值型別的變數可以被初始化為任何有效的數值文字一樣。 這兩種初始化格式對於字串都是有效的

1
2
string mystring = "This is a string";
string mystring ("This is a string");

字串還可以執行基本資料型別可以執行的所有其他基本操作,例如在沒有初始值的情況下宣告以及在執行期間分配值

// my first string
#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++ 字串的更多詳細資訊,您可以檢視 字串類參考
Index
目錄