---
# System prepended metadata

title: 資料型態&變數宣告
tags: [程設班講義]

---

# 基本內建型態
C\++是一種強型別語言，**不像python和javascript是弱型別語言**(聽懂了嗎，學C\++最棒了)，因此C\++所有的變數都必有型別(type)，且<font color="#EB6E41">所有變數使用前都需要經過宣告</font>。

:::warning
基本內建型別是不需要任何標頭檔和命名空間就可以使用的指令。
:::

## 整數型態
| 整數型態 | 數值範圍  | 表示為2的次方   |位元組|
|:------------------------|:------------------------ |:---------------------------------------------------------- |:---------------------- |
| short                    | $-32678$ ~ $32767$                                             | $-2^{15}$ ~ $2^{15}-1$ |2|
| unsigned short           | $0$ ~ $65535$                                                  | $0$ ~ $2^{16}-1$       |2|
| int                    | $-2,147,483,648$ ~ $2,147,483,647$                         | $-2^{31}$ ~ $2^{31}-1$ |4|
| unsigned int             | $0$ ~ $4,294,967,295$                                          | $0$ ~ $2^{32}-1$       |4|
| long long            | $-9,223,372,036,854,775,808$ ~ $9,223,372,036,854,775,807$ | $-2^{63}$ ~ $2^{63}-1$ |8|
| unsigned long long | $0$ ~ $18,446,744,073,709,551,615$                         | $0$ ~ $2^{64}-1$       |8|

其中 `int`、`long long`、`unsigned long long` 較常使用。

## 浮點數型態
| 浮點數型態 | 數值範圍  |位元組|
| ---------- | ---------------------------------- |-|
| double     | $-1.7\times10^{308}$ ~ $1.7\times10^{308}$ |8|
| float      | $-3.4\times10^{38}$ ~ $3.4\times10^{38}$    |4|

:::warning
因為小數點精度問題，盡量不要用float。
當數字≥999999.5(約$10^7$)時，使用`double`將會捨棄後方幾位的數並轉成用 $e$ ($10$的次方)表示。(ex.$100000000$➙$1\times10^8$➙顯示$1e+008$、$50000000123$➙$5\times10^{10}$➙顯示$5e+010$)
:::

## 字元型態
| 字元型態 | 宣告功能 | 數值範圍  |位元組|
| -------- | -------- |:------------------------- |-|
| char     | 宣告字元 | $-128$ ~ $127$ |1|


## 邏輯型態
| 邏輯型態 | 宣告功能 | 數值範圍            |位元組|
| -------- | -------- | ------------------- |-|
| bool     | 邏輯變數 | $true(1)$ 、 $false(0)$ |1|


# 變數宣告
在使用變數之前，要先告訴電腦我們要用變數，電腦會準備記憶體中間儲存該變數，若沒有宣告它的資料型態或搞錯資料型態，都有可能會出現無法編譯的情況。

## 宣告語法
```cpp=
#include<iostream>
using namespace std;
int main(){
    
    //正確
    
    int a, b ;    //多個變數時中間以逗點隔開。
    
    int A ;       //大寫和小寫字母視為不同變數。
    
    int b ;       //已使用過的變數不得重複宣告。
    
    int c = 20 ;  //宣告同時賦值。
    
    //錯誤
    
    int ｎ ;      //全形，跑不了，必須是半形。
    
    int return    //變數名稱不能是保留字。
        
    //比較
    
    int 1n        //變數名稱數字不可在前。
    int n1        //但可以在後。

    int chrislai is god  //變數名稱中不能有空格。
    int chrislai_is_god  //但可以用底線。
    
    return 0;
}
```

:::warning
雖然某些編譯器上會自動將沒有設置初始值的變數設為0，但是在judge系統上不一定會自動設初始值為0，導致在編譯器上執行結果正常，但是judge端會出現錯誤。

以記錄總和為例。
```cpp=
int sum = 0;    //sum值設為0
for(int i = 0; i < 13; i++){
    sum += i;
}
```
:::

## 全域變數
指宣告在`int main()`之上的變數，在程式<font color="#EB6E41">**編譯**</font>時就被宣告好(宣告在`main()`裡面的稱為區域變數，在<font color="#EB6E41">**執行**</font>時才會宣告)，其他使用都和區域變數一樣。

全域變數有幾個特性，例如不須被初始化就會自己初始化好(整數型態初始化成`0`、小數型態初始化成`0.0`、字元型態初始化成`'\0'`(空字元)、邏輯型態初始化成`false`)。

# 例題
###### 有什麼題目沒提到或有新增的煩請留言告知。

[a313: 喔耶 水題](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a313) ( <font color="#EB6E41"> 這題被歸在這是因為它符合本課教學(不然都沒有例題)，但現階段你們不能 **<font color="#00FF00">AC</font>** ，真的別寫，我不想被罵，他要優化再優化。</font> )

###### 都看到這了難道不按個愛心支持一下嗎?
