Semorphe

同一份程式,兩種說法

切一次目標,看同一段語義變成另一種語言。 · ⏱ 約 25 分鐘

你會學到三件事

  1. C 和 C++ 在這個工具裡是同一棵語義樹的兩種投影
  2. printfcout 說的是同一件事
  3. C 沒有的那些東西,不是被拿掉,是本來就沒有

開始之前

⚠️ 這一課的內容就是那個動作本身。

先把目標切到 C++(預設),貼上:

int main() {
    int n = 5;
    cout << n << endl;
    return 0;
}

然後把目標切到「C 語言教學」——看畫面。

一、程式碼變了,積木沒變

切過去之後你會看到:

int main() {
    int n = 5;
    printf("%d\n", n);
    return 0;
}

而積木那一邊,那顆「印出」積木一模一樣。

因為它們是同一顆概念cout << n << endlprintf("%d\n", n) 是同一件事的兩種寫法,而積木上寫的是那件事,不是那個寫法。

語義只有一份,投影有很多種。

二、printf 的格式字串

printf("%d\n", n);
這一段 意思
"%d\n" 格式字串——%d 是「這裡放一個整數」
\n 換行(endl 的對應物)
n 要放進 %d 的東西

常用的幾個:

放什麼
%d 整數
%f 小數
%c 一個字元
%s 一段字串

⚠️ %d 的數量要和後面的參數對得上,而 C 不會幫你檢查。 多一個少一個都是印出垃圾——這是 C 最經典的一種錯。

讀進來對應的是 scanf

scanf("%d", &n);      // ⚠️ 注意那個 &

那個 & 現在先照抄,第 3 課會解釋它為什麼非有不可

三、C 沒有的東西

切到 C 之後,積木盤會少掉一些東西:

C++ 有 C 沒有
string 只有 char[](第 2 課)
vector 只有陣列,而且大小固定
class 只有 struct(第 5 課)
new / delete malloc / free(第 4 課)
cout / cin printf / scanf

⚠️ 這不是「C 比較弱」。 C 早了 C++ 十幾年, 而那些東西是後來加的。C 的少,是它的設計。

接下來四課就是走過這五個「沒有」。

完成的樣子

int main() {
    int n = 5;
    printf("%d\n", n);
    return 0;
}

換你了

回頭把 C++ 入門第 13 課(陣列求和)貼進來,切到 C,看它變成什麼。

哪些地方變了?哪些沒變? 那些沒變的,就是兩個語言共有的那一半。

這一課你做了什麼

如果卡住了

你看到 多半是因為
切過去之後有些積木變灰 那些是 C 沒有的概念
printf 印出奇怪的數字 %d 的數量和參數對不上
scanf 沒有反應 少了 &
中文印出亂碼 %s 和多位元組字元——這一課先用英文
在編輯器打開這一課 →