C++基本語法

IDE

CodeBlocks

CodeBlocks是非常好用的IDE,非常容易上手
各種功能都很方便
只有C++的功能也省去了不少麻煩

VSCode

擴充性很好的IDE
有許多插件可以使用
支援絕大多數程式語言

開始

C++的主要程式必須寫在main函數裡

int main(){
    // 主程式
}

註解

有時候在程式中需要注明一些程式的功能,就可以用註解
單行註解用兩個斜線開頭:

int a = 1 // 把a設置為1

多行註解用"/*""*/"包起來:

/*
常數設置
a->1, b->2
*/
int a = 1
int b = 2

變數

變數是在記憶體內準備的"儲存格",用來儲存資料,並標記資料的類型
語法為

型別 變數名;

與許多程式語言不同,C++變數名是否能用中文(Unicode字元)並沒有硬性規定,而是取決於編譯器
通常建議用英文大小寫、數字和底線"_"命名
常用基本型別有:

布林值

布林值是表示"是"和"否"的資料
"是"寫作

true

"否"寫作

false

字元

字元表示"單一個字"
'把字元包起來

整數

整數就是整數
整數有不同容許範圍的版本
最常用的是
+ int
+ long long

浮點數

浮點數可以記錄包含小數的數,但會有誤差
通常若沒有特殊需求都會直接用double而非float

輸入和輸出

C語言的核心並不包含輸出入的處理
所以要引用輸出入函數庫

#include<iostream>

輸入

std::cin >> 變數;

輸出

std::cout << 變數;

可以連著寫

它會依照變數的型別自動判斷如何輸出入
支援 字元、字串(string)、整數、浮點數
也可以自己定義處理其他類型的方法

using namespace

因為一些原因,C++的基本函數庫裡的東西都放在叫"std"的命名空間裡
所以每次呼叫都要告訴編譯器要到std裡面找,很麻煩
可以先寫一行

using namespace std;

(注意分號)
告訴編譯器把"std"裡的東西拿出來,就可以不用每次都要加上"std::"

小範例:計算a+b

#include<iostream>
using namespace std;
int main(){
    int a,b;
    cin >> a >> b;
    int c = a+b;
    cout << c << "\n";
}

IO優化

C++的輸出入默認會比純C的慢
但只要適當優化就能比純C還快
(只有打競賽時這樣做,實際應用不建議做IO優化)

一、優化指令

#include<iostream>
using namespace std;
int main(){
    ios::sync_with_stdio(0);cin.tie(0);
}

優化指令包含兩項
1. 告訴C++不需要去和純C的IO同步
2. 告訴cin讀資料的時候不要去flush(cout)

換行

不要用endl,用"\n"'\n'(兩個一樣快)
因為endl會去flush(cout)

為什麼不要flush

cout是一種檔案流,用來將資料輸出到標準輸出stdout,但把資料從記憶體傳出去很慢,所以會在記憶體中開一個緩衝區buffer暫時儲存輸出,flush指令會把緩衝區的內容傳出去,速度較慢,雖然在實際應用中可能沒什麼差別,但在程式競賽中就可能是AC和TLE的差別

基礎運算子

常用的計算符包含:

  • 數學運算子 + - * / %
  • 比較運算子 > < >= <= == != not_eq
  • 位元運算子 << | & ^ >> ~ bitand bitor xor compl
  • 邏輯運算子 ! || && ! || && not and or
  • 賦值運算子 += -= *= /= %= <<= >>= |= &= ^= ++ -- and_eq or_eq xor_eq
  • 其他 [] () {} ?: <::> <%%>

語法結構

條件判斷

條件判斷可以指定在特定條件符合值才執行部分程式碼

//縮排不是必須的
if (條件){
    程式碼
}else if (另一個條件){ //非必要,可以有很多
    程式碼
}else{ //非必要
    程式碼
}

迴圈

for迴圈:

for迴圈有兩種

傳統for

for (初始化;繼續條件;結尾動作){
    程式碼
}

Ex.重複n次

for (int i = 0;i < n;i++){
    程式碼
}

迭代for

for (型別 變數名 : 容器){
    程式碼
}

while迴圈:

while迴圈可以在條件符合時不斷重複相同程式碼

while (條件){
    程式碼
}

break continue

在迴圈中使用break可以立刻跳出當前迴圈

在迴圈中使用continue可以回到迴圈起點

注意:要加分號

自訂函數(副程式)

自訂函數可以把重複用到的功能打包起來,方便使用
語法:

回傳類型 函數名(參數列表){
    程式碼
    return 回傳值; //非必要 不一定要在最後一行
}

三元運算子

三元運算子可以簡化條件判斷
語法:

條件?值1:值2