無痛入手 C++:基礎系列2 - 資料型態和變數

2024/04/21閱讀時間約 12 分鐘

資料型態

資料型態是一種分類資料的方式,以下是幾種 C++ 最常見的資料型態:
1. 整數 (int),如: -1, 0, 10, ...
2. 浮點數 (float),也就是所謂的小數,如: -0.1, 3.14,...
3. 布林值 (bool),只有兩種可能: 真 (true) 和假 (false)。
4. 字元 (char),指的是一個符號,包含英文字母、英文標點符號、四則運算符號、大於小於等於、空格、空行等等的,需要用兩個單引號包起來,如: 'A'、'?'、'%'、' '、'\n'
5. 字串 (string),一個或多個字元用兩個引號包起來,如: "Hello C++!"、""、"\n"

char 和 string 的差別在於一個是用單引號包起來,一個是用雙引號包起來,且 char 只能含有一個符號。以下列了幾個要注意的部分:
1. 字串可以不包含內容,又稱空字串 ("")。
2. 字串可以只包含一個字元,只要用雙引號包起來的就是字串

只要是屬於上述資料型態的資料,都可以直接被 cout 印出來,試試看執行下列的程式:

#include <iostream>

using namespace std;

int main() {
// integer
cout << -1 << '\n';
cout << 0 << '\n';
cout << 10 << '\n';
// float
cout << -0.1 << '\n';
cout << 3.14 << '\n';
//char
cout << 'A' << '\n';
cout << '?' << '\n';
// bool
cout << true << '\n';
cout << false << '\n';
// string
cout << "This is a string.\n";
return 0;
}

注意: 布林值的 true/false 也可以替換成整數的 0/1,它們彼此是等價的。假如一個布林值印出來是 0,表示它的值為假 (false),反之亦然。

C++ 還有許多其他資料型態,不過上述介紹到的就足夠我們寫出很多程式了,因此剩下的資料型態會留到日後有需要的時候再介紹。

跳脫字元

也許有人看到這裡會覺得很奇怪,換行符號 '\n' 看起來像是兩個字元組合而成的,為什麼被歸類在字元呢?

這是因為 \ 屬於跳脫字元 (escape character),是一個特殊的存在,\ 加上後面的字元合起來才是一個字元,是具有特殊意涵的,比如 '\n' 就是換行的意思。C++ 還定義了許多其他具有特殊意義的字元,有興趣的話可以自行 Google 跳脫字元。

跳脫字元還有兩個常見的用法:
1. 用來印出 \ 本身: 單獨的 \ 是不合法的,它後面必須跟隨另一個字元,所以如果要印出 \ 這個符號本身的話,需要使用 cout << '\\'
2. 在字串中包含 ": 上面介紹過,字串 (string) 的定義是一堆字元被兩個雙引號包起來,如果今天這樣寫: "print " in a string",C++ 會認為第二個引號就是字串的結尾,後面的內容就會因為語法不符合 C++ 的規範而導致錯誤。
正確的寫法是在引號前面加上 \ : "print \" in a string"


變數

剛剛介紹的東西還有個專有名詞: 常值 (literal)。意思是有一個固定的數值,像 1 就是整數型態的常值,3.14 則是浮點數型態的常值,"Hello" 則是字串型態的常值,依此類推。但程式中的數值常常是需要改變的,這就是變數的功用。

變數 (variable),顧名思義,它的值是可以改變的。它就像一個盒子,裡面裝著資料,我們可以從盒子中取出資料來使用,也可以把舊的資料丟掉改放別的資料。

變數有兩種屬性: 資料型態以及名稱
變數裡面只能放資料型態跟它相符的資料,舉例來說: 資料型態為整數 (int) 的變數裡面就只能放整數。

變數的名稱則可以隨便取,不過要符合以下條件:
1. 不可以使用數字作為開頭。
2. 不可以使用一些特殊字元,像是 *&^% 之類的字元。
3. 變數名稱不可以與 C++ 內定的關鍵字同名 (如 main、int、namespace...)。

符合規範的例子: date、number99、_HelloWorld_。
不符合規範的例子: 3A、holly_sh*t、float。

只要變數的資料型態是可以被 cout 印出來的,我們就可以使用 cout 將變數的值印出來。

變數宣告

在使用一個變數前,需要先進行「宣告」(declare)。
意思是告訴電腦我想要一個叫做 xxx 的變數,它的變數型態是 ooo。
以下是變數宣告的例子:

// declare an int
int x;
// declare a float
float i_am_floating;
// declare a char
int a_char;
// declare a string
string many_char;

注意: 如果要宣告資料型態為 string 的變數的話,需要使用 <string> 函式庫,在程式的一開始加上 #include <string>
這是因為 string 並不是 C++ 內建的資料型態,而是標準函式庫所提供的資料型態 ,因為太好用了,所以在這邊就先介紹 (<string> 和 <iostream> 都是標準函式庫的一員,要使用它們的話記得加上 using namespace std;這行程式)。
其他前面介紹到的 int、float、char、bool 都是內建的資料型態,不需要使用任何函式庫就可以在程式中使用。

變數的給值

利用 = 可以把資料放進變數中,這個行為叫做 assign。
通常會在變數宣告的同時,給予它一個初始值,這個行為叫做初始化。雖然 C++ 不會強制你這麼做,但這是一個良好的習慣,可以避免一些潛在的 bug。
以下是不同型態的變數宣告,以及常用的初始值:

// this is an int
int x = 0;
// this is a float
float i_am_floating = 0.0;
// ​this is a bool
bool b = false;
// this is a char
int a_char = '\0';
// this is a string
string many_char = "";

補充: char 型態的變數通常會用 '\0' 來進行初始化。可以注意到它跟 '\n' 一樣都是具有特殊意義的,這個部分會留到之後再介紹。

一個變數一次只能存放一個值,也就是說,如果同個變數被多次給值,舊的值就會被新的值覆蓋掉。執行下列的程式 (記得補上 #include 和 main 等等的部分):

// initialize x
int x = 0;
cout << x << '\n';
// assign -1 to x
x = -1;
cout << x << '\n';
// assign 1000 to x
x = 1000;
cout << x << '\n';

一次宣告、初始化多個變數

相同資料型態的變數可以在同一行進行宣告與初始化,如下所示:

int x, y = 0, z = 1;

一共宣告了三個型態為整數的變數,分別為 x (未進行初始化)、y (初始值為 0) 和 z (初始值為 1)。

資料交換

我們可以利用 = 來交換兩個變數的內容,這個行為有一個專門的用語: swap。如下所示:

int x = -1, y = 10;
int tmp;
tmp = x;
x = y;
y = tmp;

我們宣告了第三個變數: tmp。因為執行到 x = y 的時候,x 原本的內容會被 y 的內容取代掉,所以需要使用 temp 來暫時儲存 x 的內容。

常數變數

我們可以在變數宣告前面加上 const,表示這個變數的值在初始化以後就不能改變了,修改常數變數是不合法的,電腦會回報錯誤。假如程式中有某些不會改變的數值,如圓周率 pi: 3.14,就可以使用常數變數來儲存,可以避免意外修改到這個變數的值,也可以提升程式的效率

const int x = 0;
const float pi = 3.14;

注意: 使用 const 來宣告變數的話,必須同時進行初始化。這是因為除了初始化以外,這個變數不會再有任何機會被給予正確的數值了。

有的人看到這裡可能會好奇說,為什麼不直接使用常值 (literal) 就好了呢? 舉例來說,有個程式需要在許多地方使用到圓周率 pi,如下面的範例程式,有許 use case 都跟 pi 有關,於是我們就在這些地方都使用 3.14 來表示圓周率。

int main() {
// use case1
// use case2
// use case3
// ...
return 0;
}

假如過了一陣子我們發現 3.14 算出來的答案不夠精確,需要使用 3.14159 才夠,這時候就需要把所有使用到 3.14 的地方一個一個改成 3.14159。

假如我們開發的是擁有幾百萬行程式碼的大型軟體,大概會改到崩潰吧...這時候你可能會想,可以搜尋檔案中所有 3.14 出現的地方然後自動改成 3.14159 就好啦。不幸的是,假如程式中有任何出現 3.14 但不是用來表示圓周率的地方 (比如某個跟圓周率無關的參數或規格剛好就是 3.14 ),通通都會被改掉,也就是說,必須透過人工的方式檢查所有的 3.14 來確定它們都是用來表示圓周率。

使用 const float pi = 3.14 的好處就是,所有跟圓周率有關的地方都是使用 pi 而不是 3.14,如此一來,想要把圓周率改成 3.14159 只需要改一行程式: const float pi = 3.14159,所有使用到圓周率的地方都會自動使用更新後的數值。


總結

  1. 今天介紹了四種常見的 C++ 內建資料型態: int、float、bool、char 以及一種定義在標準函式庫的資料型態: string。

2. \ 是跳脫字元,需要和另一個字元搭配使用,具有特殊的意涵,如 '\n' 代表換行。

  1. 變數是用來存放資料的盒子,宣告變數的時候需要指定它的資料型態和名稱,可以透過 = 來改變變數內的資料。
  2. 可以在宣告變數的時候加上 const,確保它的值在初始化後不會再被修改。


習題

修改下面的程式,讓它印出下列文字:
What does the fox say?
"Ding Ding Ding Ding Ding Ding Ding!!!"

#include <iostream>

int main() {
string str1;
string str2​ = ""Ding Ding Ding Ding Ding Ding Ding!!!"";
str1 = "What does the fox say?"
cout << str1 << str;
return 0;
}

提示: 可以閱讀視窗顯示的錯誤訊息來找出程式的 bug。


1會員
12內容數
程式設計 & 電腦系統 & 系統軟體
留言0
查看全部
發表第一個留言支持創作者!