{%hackmd @hlc23/text_highlight %} # C++ 基礎語法 --- [About me](https://hackmd.io/@hlc23/about_me) --- #### 目錄 1. 原始碼檔案架構 2. 變數 3. 數學運算子 4. 邏輯/關係 運算子 5. 基本輸入輸出 ---- 註: 此簡報教學內容較偏向**程式競賽**用法 部份技巧在**專案開發**可能較不適用 --- ## 原始碼檔案架構 ---- ## <span class=sample>sample</span> ```cpp= #include <iostream> using namespace std; int main(){ cout<<"Hello World"; return 0; } ``` 你是否想過前兩行在做什麼? ---- 簡單分解成幾部份來說明 ---- ## <span class=pre_cmd>#include</span> ``` ``` ++include++在英文中有**包含**,**包括**的意思 在C/C++中用於引入其他已經完成的程式碼 以便於重複使用 ``` ``` 前面的 **<span class=pre_cmd>\#</span>** 記得要打 Note: 此處 # 用法不細講 ---- ## <span class=pre_cmd> &lt;iostream> </span> 是一個內建<font color=#33a9ff>標頭檔</font> 內含標準輸入(<span class=obj>cin</span>)輸出(<span class=obj>cout</span>) ``` ``` <font color=#33a9ff>標頭檔</font>(head file) <font color=#33a9ff>標頭檔</font>是一種包含C\+\+程式碼的檔案 通常用來宣告<span class=obj>變數</span>、<span class=fn>函數</span>、<span class=obj>類別</span>等程式元素 以便在其他的C\+\+檔案中使用 ---- ## 補充 在程式競賽中,為求方便 有一個++萬用標頭檔++ 引入它就等於引入好幾個常用的標頭檔 ### <span class=pre_cmd> &lt;bits/stdc++.h> </span> --- 註:此標頭檔只在GCC系列的編譯器能使用 ---- ## <span class=keyword>using namespace</span> <span class=obj>std</span>; 使用 <span class=obj>std</span> <span class=keyword>命名空間</span> ``` ``` <span class=obj>std</span>? <span class=keyword>命名空間</span>? 這些是什麼? ---- ## <span class=keyword>命名空間(namespace)</span> <span class=keyword>命名空間</span>是用來區分相同名稱的<span class=obj>物件(常數、函式)</span>等 避免誤用、混淆 ``` ``` 概念類似於 <font color=#9fffff>**台中市**</font> 的 <font color=#9fd358>**民族路**</font> <font color=#9fffff>**彰化市**</font> 的 <font color=#9fd358>**民族路**</font> 其中 <font color=#9fffff>**台中市 彰化市**</font> 就是<span class=keyword>命名空間</span>的概念 ---- ### <span class=sample>sample</span> <span class=obj>cin</span>, <span class=obj>cout</span> 其實是<span class=obj>std</span><span class=op>::</span><span class=obj>cin</span>, <span class=obj>std</span><span class=op>::</span><span class=obj>cout</span> ``` ``` 註:這裡的<span class=op>::</span>是一個運算子 用於指定特定的命名空間 如 <span class=obj>std</span><span class=op>::</span> <span class=obj>cin</span>意思是 <span class=obj>std</span> <span class=keyword>命名空間</span> 的 <span class=obj>cin</span> ---- ## <span class=obj>std</span> ``` ``` <span class=obj>std</span>是C\+\+標準庫的<span class=keyword>命名空間</span>,它包含了C\+\+語言提供的各種功能和數據結構 --- ## 變數 ---- #### 常用變數類型 - <span class=type>int</span> (<span class=type>long long</span>) - <span class=type>float</span> (<span class=type>double</span>) - <span class=type>bool</span> - <span class=type>char</span>/<span class=type>string</span> ---- ### 變數命名規則 - 只使用英文、數字、底線(_) - 不使用雙下底線(__)作為開頭 - 開頭不能為數字 - 與關鍵字不重複 ---- ## <span class=type>int</span> $-2147483648 \sim 2147483647$ $-2^{16}\sim 2^{16}-1$ ```cpp= int n = 1450; ``` ---- #### <span class=type>long long int</span> $-9223372036854775807 \sim 9223372036854775807$ $-2^{32}\sim 2^{32}-1$ ```cpp= long long n = 314159265358979323 ``` 一般只要看到數字大於$10^6$就可以考慮使用 ---- ## <span class=type>float</span> | Type Name | bits | 精準度 | |:----------------------------------- | ---- | --------------- | | <span class=type>float</span> | 32 | $6 \sim 7 位$ | | <span class=type>double</span> | 64 | $15 \sim 16 位$ | | <span class=type>long double</span> | 128 | $18\sim 19 位$ | 浮點數存在誤差,能不用就不用 ---- ### <span class=sample>sample</span> ```cpp!= float f1 = 3.1415927; double f2 = 3.141592653589793; long double f3 = 3.1415926535897932384; ``` ---- ## <span class=type>bool</span> 布林值(<span class=true>true</span> / <span class=false>false</span>)同時也能作為1跟0使用 ```cpp= bool b1 = true, b2 = false; ``` ---- ## <span class=sample>sample</span> ```cpp= signed main(){ bool b1 = true; cout<<(b1+b1)*2; // output = 4 } ``` ---- ## <span class=type>char</span> 字元 常配合陣列(<font color=#c80bfd>Array</font>)使用 或是利用ASCII編碼特性使用 ```cpp char w = 'a'; ``` ---- ## <span class=type>string</span> 字串,一個比樓上的<span class=type>char</span>還好用的東西 用來儲存字元序列 ```cpp string text = "hello world"; ``` --- ## 數學運算子 ---- #### 二元數學運算子 ``` ``` | 名稱 | 符號 | | ---- | ---- | | 加 | <span class=m_op>+</span> | | 減 | <span class=m_op>-</span> | | 乘 | <span class=m_op>\*</span> | | 除 | <span class=m_op>/</span> | | 模除(取餘) | <span class=m_op>%</span> | ---- ### <span class=sample>sample</span> ```cpp= int n1 = 2 + 3; // n1 = 5 int n2 = 5 - 2; // n2 = 3 int n3 = 6 * 2; // n3 = 12 int n4 = 8 / 4; // n4 = 2 int n5 = 7 % 5; // n5 = 2 ``` ---- ### 縮寫 ``` ``` 一個整數<font color=#c80bfd>n1</font>的值為3 ```cpp int n1 = 3; ``` 若要將<font color=#c80bfd>n1</font>加上5 可以寫 ```cpp n1 = n1 + 5; ``` 或是下面的縮寫 ```cpp n1 += 5; ``` ---- #### <span class=sample>sample</span> ```cpp int n = 2; n -= -5; // n=7 n *= 6; // n=42 n /= 5; // n=8 n %= 3; // n=2 ``` ---- #### 一元數學運算子 | 名稱 | 符號 | | ---- | ------------------------- | | 自增 | <span class=m_op>++</span> | | 自減 | <span class=m_op>-\-</span> | ---- ### 前面後面差很多 ```cpp= int a = 10; int b = ++a; // a 和 b 都是 11 int c = a++; // c 是 11,a 是 12 ``` 前: 先++改變++ 再**使用** 後: 先++使用++ 再**改變** --- ## 關係/邏輯 運算子 ---- ### 關係運算子 ``` ``` | 名稱 | 符號 | |:--------:|:-----------------------------:| | 大於 | <span class=re_op>></span> | | 小於 | <span class=re_op> &lt; </span> | | 等於 | <span class=re_op>==</span> | | 不等於 | <span class=re_op>!=</span> | | 大於等於 | <span class=re_op>>=</span> | | 小於等於 | <span class=re_op> &lt;= </span> | ---- #### 邏輯運算子 ``` ``` | 名稱 | 符號 | | ------- | -------------------------- | | 非(not) | <span class=l_op>!</span> | | 且(and) | <span class=l_op>&&</span> | | 或(or) | <span class=l_op>\|\|</span> | ---- ### not 真值表 | A | not A | |:-------------------------------- | -------------------------------- | | <span class=true>True</span> | <font color=#F6073A>False</font> | | <font color=#F6073A>False</font> | <span class=true>True</span> | ---- ### and 真值表 兩者成立則為真 | A | B | A and B | |:----- | ----- | ------- | | <span class=true>True</span> | <span class=true>True</span> | <span class=true>True</span> | | <span class=true>True</span> | <font color=#F6073A>False</font> | <font color=#F6073A>False</font> | | <font color=#F6073A>False</font> | <span class=true>True</span> | <font color=#F6073A>False</font> | | <font color=#F6073A>False</font> | <font color=#F6073A>False</font> | <font color=#F6073A>False</font> | ---- ### or 真值表 兩者中有一成立則為真 | A | B | A or B | | -------------------------------- | -------------------------------- |:-------------------------------- | | <span class=true>True</span> | <span class=true>True</span> | <span class=true>True</span> | | <span class=true>True</span> | <font color=#F6073A>False</font> | <span class=true>True</span> | | <font color=#F6073A>False</font> | <span class=true>True</span> | <span class=true>True</span> | | <font color=#F6073A>False</font> | <font color=#F6073A>False</font> | <font color=#F6073A>False</font> | ---- #### <span class=sample>sample</span> ```cpp= bool a = !True; bool b = False && False; ``` ---- <font color=#5f9ea0>關係運算子</font>與<font color=#5f9ea0>邏輯運算子</font> 運算順序為:<font color=#5f9ea0>括號</font>$\rightarrow$<font color=#5f9ea0>關係</font>$\rightarrow$<font color=#5f9ea0>邏輯</font> 運算後的結果應視為<font color=#ff6347>布林值</font> ---- #### <span class=sample>sample</span> ``` ``` 請問 b 是 <span class=true>True</span> or <span class=false>False</span>? ```cpp= bool b = !(1 == (5>4) || 3 < 2); ``` ---- ## 答案是 <span class=false>False</span> ---- ### 說明 ```cpp= bool b = !(1 == (5>4) || 3<2); = !(True == True || False) = !(True) = False ``` --- ## 基本輸入輸出 ---- 使用<span class=obj>cin</span>與<span class=obj>cout</span>進行++輸入++與++輸出++ ---- 所以具體來說怎麼用? ---- ### <span class=sample>sample</span> ```cpp= #include<iostream> using namespace std; int main(){ string text; cin>>text; cout<<text; } ``` <span class=obj>cin</span>搭配 **<span class=op>>></span>** 使用 <span class=obj>cout</span>搭配 **&lt;&lt;** 使用 ---- cin / cout用 <span class=op>>></span> 或 <span class=op>&lt;&lt;</span>傻傻分不清? ---- ### 右移(>>)與左移(&lt;&lt;) --- \>\> 是把右邊的值放到左邊的物件做使用 << 則反之 ```cpp cin>>text; cout<<"Hello World"; ``` ---- 幾個<span class=obj>cin</span>與<span class=obj>cout</span>需注意的點 ---- ### <span class=obj>cin</span> 遇到空格就會結束一個輸入 ```cpp= string a,b; cin>>a>>b; ``` 若輸入`"apple book sheep"`則 a 的值為++apple++ b 的值為++book++ 你會發現sheep沒有被記錄下來 ---- ### <span class=obj>cout</span>不會換行 如果需要換行可以使用<span class=obj>std</span><span class=op>::</span><span class=obj>endl</span>或是跳脫字元<span class=obj>&#34;\n&#34;</span> ``` ``` <span class=sample>sample</span> ```cpp cout<<"hello"<<endl<<"world"; ``` ```cpp cout<<"hello\nworld"; ``` ---- #### 補充:常用的跳脫字元 |符號|名稱| |-|-| |\\'|單引號(single quote)| |\\"|雙引號(double quote)| |\\\\ |反斜線(backslash )| |\n |換行(line feed)| |\r |回車(carriage return)| ##### 詳細請見[wiki](https://zh.m.wikipedia.org/zh-tw/%E8%BD%AC%E4%B9%89%E5%AD%97%E7%AC%A6) ---- #### 小試身手 [Zerojudge a001. 哈囉](https://zerojudge.tw/ShowProblem?problemid=a001) ---- 題目要求輸入一組文字並依格式輸出 ---- ### 觀察範例 |輸入|輸出| |-|-| |world|hello, world| |C++|hello, C++| |Taiwan|hello, Taiwan| --- 不難發現, 輸出的格式都是 hello, {輸入} --- ##### 注意:逗點後有一個空格 ---- ### 參考答案 ```cpp= #include<iostream> using namespace std; int main(){ string text; cin>>text; cout<<"hello, "<<text; return 0; } ``` ---- #### 小試身手 [Zerojudge a002. 簡易加法](https://zerojudge.tw/ShowProblem?problemid=a002) ---- ### 參考答案 ```cpp= #include <iostream> using namespace std; int main(){ int n1, n2; cin>>n1>>n2; cout<<n1+n2<<endl; return 0; } ```
{"metaMigratedAt":"2023-06-17T22:35:20.389Z","metaMigratedFrom":"YAML","title":"C++(1) 基礎語法","breaks":true,"contributors":"[{\"id\":\"8ffbb050-25e2-4983-835c-57980efb4f41\",\"add\":24952,\"del\":15046}]","description":"About me"}
    398 views