【C++ 筆記】資料型態 / 變數 - part 2
===
目錄(Table of Contents):
[TOC]
---
很感謝你點進來這篇文章。
你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧!
資料型態(or 資料型別:Data Type)
---
資料型態,也有很多人稱資料型別,其實都一樣意思,都叫做 Data Type。
問題來了,啥是資料型態呢?簡單來說,就是~~資料的型態~~。
咳、咳(清嗓),正確來說,在數學上我們將實數分為有理數、無理數,有理數又可分為整數跟小數,就是差不多這個概念啦!
***所以資料型態就是將資料分類成不同的類別。***
那另外呢,因為我們程式在執行的時候,需要在記憶體空間當中運算並且儲存這些資訊,而每個資料型態都是不同的個體,每個資料型態的儲存容量也不太一樣,所以接下來資料型態你會看到有它的範圍所在。
好的,接下來是C++的基本內建型態:
### 內建型態(Built-in Type)
---
* bool - 布爾型態 or 布林型態
* char - 字元型態
* int - 整數型態
* float - 浮點數型態
* double - 雙浮點數型態
* void - 虛無型態(無型態)
| 型態 | 位元 | 範圍 |
| -------- | -------- | -------- |
| char | 1個位元組 | -128 到 127 或者 0 到 255 |
| unsigned char | 1個位元組 | 0 到 255 |
| signed char | 1個位元組 | -128 到 127 |
| int | 4個位元組 | -2147483648(負的2的31次方) 到 2147483647(2的31次方減1) |
| unsigned int | 4個位元組 | 0 到 4294967295 |
| signed int | 4個位元組 | -2147483648 到 2147483647 |
| short int | 2個位元組 | -32768 到 32767(2的15次方減1) |
| unsigned short int | 2個位元組 | 0 到 65,535 |
| signed short int | 2個位元組 | -32768 到 32767 |
| long int (long、signed long int) | 4個位元組 | -2147483648 到 2147483647 |
| unsigned long int | 8個位元組 | 0 到 18,446,744,073,709,551,615(2的64次方減1) |
| float | 4個位元組 | 32位元記憶體空間,3.4E +/- 38 (7 位數) |
| double | 8個位元組 | 64位元記憶體空間,1.7E +/- 308 (15 位數) |
| long long | 8個位元組 | 64位元記憶體空間,表示 -9,223,372,036,854,775,807 到 9,223,372,036,854,775,807 的範圍 |
| long double | 16個位元組 | 128位元記憶體空間,可提供 18-19 位元有效數字。 |
表格參考及擷取至:
[C++ 数据类型 | 菜鸟教程](https://www.runoob.com/cplusplus/cpp-data-types.html)
[資料類型範圍 | Microsoft Learn](https://learn.microsoft.com/zh-tw/cpp/cpp/data-type-ranges?view=msvc-170)
看到這麼一長串的表格,別緊張,這些完全不用背,只需要記得哪些可以用來做大數運算即可,還有遇到那些輸入不需要負號的資料,那麼就可以使用 unsigned ... 資料型態。
而各個型態的儲存容量大小與系統位數有關係,不過目前通常都是以 64 位元作為主流,不太需要擔心這個的問題。總之,不同作業系統對這個會有影響。
至於要查看資料型態的大小(位元組),我們可以使用指令 sizeof(資料型態) 查看,以下是一個簡單的範例(取自:https://openhome.cc/Gossip/CppGossip/DataType.html):
```c
#include <iostream>
using namespace std;
int main() {
cout << "\n型態\t大小(bytes)";
cout << "\nint\t" << sizeof(int);
cout << "\nlong\t" << sizeof(long);
cout << "\nfloat\t" << sizeof(float);
cout << "\ndouble\t" << sizeof(double);
cout << "\nchar\t" << sizeof(char);
cout << "\n";
return 0;
}
```
看到這程式碼我相信你的第一個念頭一定是想說,\n、\t 是啥啊?
這個東西叫做跳脫字元,主要是由反斜線 "\" 加上其他指定的英文字母組成,每個跳脫字元都有不同的意義,像是 \n 就表示換行的意思,而 \t 表示一個縮排(就是按一下 tab 鍵)。
那,我們要學資料型態幹嘛?到現在我還看不出來耶。
沒關係,下一節告訴你!資料型態其實是有非常大的妙用的!
變數(Variable)
---
C++ 的變數宣告如下程式碼:
```cpp
int x = 0;
```
int 表示資料型態,x 是變數名稱,0 是變數的值。
變數是拿來幹嘛的呢?用來存放資料型態(含值)的!
我們可以把變數想像成是一個容器,專門用於存放各式各樣的資料型態,像是 int 整數型態。
資料型態就有點像是容器的形狀,有了容器跟形狀以後,我們可以加水(加入數值),凡是容器都有他的上限,所以如果我們將水倒滿了,倒到滿出來時,這個我們在程式設計上稱之為溢位(Overflow)。
溢位時程式會自動變回去最小值。
例如 int 能放的資料有 -2147483648 ~ 2147483647,此時如果 2147483647 再 + 1,則會跑到 -2147483648。
不過話說回來,我們要在 C++ 當中宣告一個變數,需要先提前讓編譯器告知你的變數要存放什麼類型的資料型態。例:int。
再來定義他的變數名稱,之後為他定義一個值。
完整步驟如下:
1. 宣告資料型態。(如:int)
2. 寫變數名稱
3. 寫值
4. 加上你的分號!!!!!
有關於變數名稱其實也有相當大的學問,像是變數名稱大小寫不同就是不同的變數,接下來讓我們看看變數名稱有哪些規則需要注意的吧!
### 識別字(identifier)
---
識別字(identifier),是用來辨識變數、函數的一個規則,也可以把他想像成是各個名稱的命名規則。
一個識別字從英文字母 A-Z or a-z 或 底線 _ 起頭,需要特別注意的是,就只能用「英文字母」、底線 _ 開頭,其他以外的都不行。以上述開頭之後,就可以放入像是數字(0-9)、底線 _ 等等的其他東西都行,但必須注意的是,無論在什麼位置,都不能以特殊字元為識別字,像是 !@#$%^* 這些等等。
而另外一個需要注意的就是,大小寫不同的識別字是不同的識別字。
以變數名稱為例:
```cpp=
#include <iostream>
using namespace std;
int main(){
int x = 0;
int X = 1;
cout << x << endl;
cout << X << endl;
return 0;
}
```
輸出結果:

註:endl 表示換行,但其實這跟 "\n" 有些許差別,問就是你自己看這篇:[std::endl ?? - HackMD](https://hackmd.io/@magical/ryMaPoaQ_),不懂的話沒關係。
在上面的程式碼可以看到,小寫 x、大寫 X 的輸出結果是截然不同的。
另外有關於識別字要特別說明的地方,就是關鍵字這個東西。
關鍵字是什麼?用於特定語法上的關鍵字,像是 if、while 等等是關鍵字,舉 if 為例,if 是條件控制的語句,要是變數把這名稱佔走了,那不就用不了條件語句了?所以關鍵字「不得」作為識別字。

圖片取自:[關鍵字 (C++) | Microsoft Learn](https://learn.microsoft.com/zh-tw/cpp/cpp/keywords-cpp?view=msvc-170)
### 有關變數的小細節
---
像是 int x = 0; 的那個 "=",大家可能會把它念成 x 等於 0,但這其實是錯的,在程式設計的世界當中,我們稱之為「指定」,我們會說 0 指定給變數 x。
總結
---
資料型態將資料分類分成很多類別,像是 int、char 等。
資料型態的用途在於程式在執行的時候,需要在記憶體空間當中運算並且儲存這些資訊,而每個資料型態都是不同的個體,每個資料型態的儲存容量也不太一樣,所以資料型態會有它的範圍所在。
變數宣告需遵守以下四步驟:
1. 宣告資料型態。(如:int)
2. 寫變數名稱
3. 寫值
4. 加上你的分號!!!!!
-> int x = 0;
識別字能夠作為個別名稱的規範,像是變數命名規則。
識別字有以下規則:
1. 開頭必須以英文字母或底線開頭
2. 不能用特殊字元當作識別字(!@#$%^&*())
3. 不能用關鍵字當作識別字
等號 "=" 在變數上的說法,我們要說指定,將某值指定給變數。
參考資料
---
[C++ 数据类型 | 菜鸟教程](https://www.runoob.com/cplusplus/cpp-data-types.html)
[資料類型範圍 | Microsoft Learn](https://learn.microsoft.com/zh-tw/cpp/cpp/data-type-ranges?view=msvc-170)
[內建類型 (C++) | Microsoft Learn](https://learn.microsoft.com/zh-tw/cpp/cpp/fundamental-types-cpp?view=msvc-170#character-types)
[C++ 变量类型 | 菜鸟教程](https://www.runoob.com/cplusplus/cpp-variable-types.html)
[關鍵字 (C++) | Microsoft Learn](https://learn.microsoft.com/zh-tw/cpp/cpp/keywords-cpp?view=msvc-170)
https://openhome.cc/Gossip/CppGossip/DataType.html