我們宣告的變數事實上皆有各自的生命週期,簡單來說原則上變數始於宣告、終於其宣告時最接近之 { 對應之 }. 當程式離開該大括弧的區塊以後,理論上我們就不應嘗試存取它。請留意,在不同的作用域宣告相同名稱的變數是會覆蓋的。以下將由小到大介紹各變數作用域。 區塊變數 宣告在條件分支與迴圈控制區塊中的變數是為區塊變數。如果我們在大括弧外使用區塊變數的名稱,編譯器會不認得它而說 identifier is undefined. 然而,技術上來說,我們其實可以透過指標在區塊變數的生命週期外嘗試存取它,因為區塊變數與區域變數都位於函式的堆疊。 #include <iostream> using namespace std; int main()...

C++ 中的函式與數學中的函數有些類似,但也卻存在一些差異。事實上,先前我們的程式碼就包含惹 main() 這個最基本的函式。撰寫程式的過程中,如果有某些片段經常重複使用,或是有其他需求比如強調或是遞迴,就可以考慮宣告成函式。 #include <iostream> using namespace std; long long foobar(int x) { return 1LL * x * x; } int main() { cout << foobar(87) << '\n' << foobar(69) << '\n'; return 0; } 上例中,我們宣告一個名為 foobar() 的函式,其回傳型別為 long...

字串是程式當中相當重要的議題,我們從 hello, world 就接觸到它,但我們始終用一種敷衍的態度點到為止。在變數型別中,提到字串其實就是字元陣列。如今我們學過陣列,終於可以好好的討論一下字串惹。 與陣列相似,C++ 的字喘也有傳統 C 風格與現代 C++ STL 兩種。雖然競賽實務上往往用 C++ STL 方便許多,但傳統 C-style string 的設計有許多巧思,值得了解。 C-style string 既然字串是字元陣列,那就直接宣告來用看看吧: #include <iostream> using namespace std; int main() { char str[] = "hello, world";...

C-style array 有時我們會需要紀錄大量同樣型別的變數,比如 GreenJudge c041, 題目輸入 \(N\) 及 \(N\) 個人的現金,那我們要怎麼儲存呢??我們可以使用陣列 (array): #include <iostream> using namespace std; int main() { int n; cin >> n; int arr[n]; // ... return 0; } 第九行的 int arr[n]; 宣告整數型別的陣列,其長度為 n. 之後,我們就能以 arr[0], arr[1], …, arr[n - 1] 陣列中的元素 (element) 來存取陣列中的元素。...

在開始前先看一段程式碼: #include <iostream> using namespace std; int main() { int a = 87, b; b = a; a = 69; cout << "a = " << a << ", b = " << b << '\n'; return 0; } 猜猜看,以上程式碼的輸出為何?? 可能會有人以為是 69 69, 但實際上是 69 87, 原因是我們宣告 a, b 兩個整數變數,他們分別儲存在記憶體的不同位置,而我們強調過: 程式語言中 a = b; 的涵義為將 a 的值設定為 b. 第八行 b = a; 將 b 的值設為 a 當時的值也就是 \(87\), 之後第九行...

學完 if-else, while, for 之後我們已經可以解決許多問題惹。作為程序流程的最後一篇,今天介紹一個幾乎很少使用的語法:goto. 如果妳有寫過 batch 或 bash script 的經驗,應該不會對 goto 感到陌生。我們可以在程式碼當中的任意處加上 label:, 再用 goto label; 跳轉到該label:. 乍看之下很方便,但是在程式碼當中大量濫用 goto 將會肇致許多麻煩,因此被多數人視為洪水猛獸,包括 MISRA 等機構建議不要使用,有些人或許甚至沒學過。 事實上,if-else, while, for 等程序流程在編譯後,於組合語言當中,也都是各式各樣的跳轉指令 (jxx), goto 就是...

我們現在會輸出一行字串,對吧??如果要輸出兩行呢??複製貼上,搞定。可是要是是 \(100, 1000\), 甚至是 \(n\) 次呢??電腦的專長除惹計算,還有做重複的事,這時我們可以運用迴圈。 while while 的語法有點像 if: while (condition) { // ... } 與 if 的不同在於 while 會重複執行大括弧內的陳述,直到 condition 為零。來看個範例吧 這個程式首先模擬丟擲一顆骰子,產生閉區間 \([1, 6]\) 內的偽隨機數為 val, 之後讓使用者輸入 n, 當 n != val 就讓使用者繼續猜。第二、八、九及十行前半是產生亂數的方法,可以先不理它。而第十行後半的 n =...

先前我們的程式很單純,就是順順得執行下去。再來的幾篇文章要介紹的陳述能讓我們的程式多些變化,並解決更多問題。 if-else 條件判斷 還記得1.1 的範例嗎??我們寫惹個程式,允許使用者輸入兩個整數,而我們輸出兩者相除之商與餘數。然而,如果今天有人很 87 輸入87 0, 那麼會發生什麼事?? 動手手試看看,讓電腦除以 0 會怎樣?? 電腦會爆炸嗎??顯然不會。如果你在 VS Code 按下 F5 偵錯,這時程式回停下來告訴你 Exception has occurred. Arithmetic exception. 如果直接在終端機執行,會輸出 floating point exception 之類的。總之,程式不正常得提前結...

其實在正式介紹之前,其實前面我們就有偷偷用過運算子惹,沒錯就是熟悉的 +, -, *, / 喇。接下來趕快來看看還有哪些運算子!! 算術運算子 +, -, *, /, % 屬之,就不多說惹。 指派運算子 這對新手是比較需要注意部分。在多數程式語言中,= 的意義與數學中的等號不同,一個表達式 a = b; 的涵義為將 a 的值設定為 b. 請在心中默念十六遍,開始!! 程式語言中 a = b; 的涵義為將 a 的值設定為 b. 簡單舉個例子: #include <iostream> using namespace std; int main() { int a = 87, b = 69; cout << "a = " << a <<...

[C++ 入門] 1.2 基本變數型別

接下來的兩篇分別介紹變數型別及運算子,初學者只需大略了解相關概念,必要時再查詢相關資料即可。 前面我們介紹如何宣告整數型別的變數,但其實變數不只有整數,其實整數也有不少種。C++ 中的基本資料型別可以分為整數、浮點數、字元及布林等等,其中因為 C++ 算是弱型別語言,字元及布林是能直接和整數轉換的。 整數 標準中的整數關鍵字計有:short, int, long, long long, … 為何要有那麼種多整數呢??以 ZeroJudge a002 為例,這題要求兩整數的和,相信對各位十分容易,肯定能輕易地寫出以下的程式: 現在請 F5 執行這個程式。輸入 \(87\ 69\), \(9487\ 666\), \(92\ 89\)...