語法書 / AA 競程語法書 上冊 / 第三單元 / 型態轉換(隱性與顯性)

3.7 型態轉換(隱性與顯性)

有時候我們會在不同型態之間轉換數值,例如把一個 bool 當成 int 來用。C++ 有兩種轉換方式:編譯器自動幫你做的(隱性轉換),以及你自己動手指定的(顯性轉換)

隱性轉換(Implicit Conversion)

C++ 會在某些情況下自動幫你轉換型態,稱為隱性轉換——你沒有明講,編譯器自己做。方便歸方便,但有時會悄悄造成意外,所以要知道它「什麼時候會發生」。下面把常見的情況一條一條列出來:

boolint:布林值當數字用

當一個 bool 出現在需要數字的地方,true 會變成 1false 會變成 0

bool b = true;
int i = b;          // true → 1
cout << i << endl;  // 輸出:1

其實你早就用過這個規則——cout << (3 > 2); 會印出 1,就是因為比較的結果是 bool,輸出時被自動轉成了 int

intbool:數字當條件用

反過來,當一個數字被當成布林值(指派給 bool、放進 if 的條件、或做 &&|| 邏輯運算),0 會變成 false,任何非 0 的值都變成 true

bool b1 = 0;   // 0 → false
bool b2 = 5;   // 非 0 → true(不是變成 5,而是 true)
cout << boolalpha << b1 << " " << b2 << endl;  // 輸出:false true

這也是為什麼 if (n) 等同於 if (n != 0)

顯性轉換(Explicit Conversion / Cast)

有時候我們想自己指定要轉成什麼型態,這叫強制轉型(cast),寫法是在值前面加一個 (目標型態)

(目標型態) 

一個很實用的例子是避免整數溢位。還記得第二單元說過,兩個 int 相乘、結果太大時會溢位嗎?我們可以在相乘前,先把其中一個強制轉成 long long,讓整段運算改用 long long 進行:

int x = 100000, y = 100000;

long long wrong = x * y;          // ✗ x * y 先以 int 相乘 → 溢位、結果錯誤
long long ok = (long long)x * y;  // ✓ x 先轉成 long long,整段用 long long 算
cout << ok << endl;               // 輸出:10000000000

動手試試看

寫一個程式,輸入一個整數 n,把它直接指派給一個 bool 變數,再用 boolalpha 印出來。試試看輸入 05-3 各會印出什麼,並想想為什麼。