Semorphe

同一份程式,兩種說法

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

你會學到三件事

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

開始之前

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

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

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

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

🟢 先把編輯器打開,跟著下面一起做。 讀完再打開的話,下面每一段你都得先記起來——而那不是這個工具要你做的事。

到編輯器打開這一課:跟著做

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

切過去之後你會看到:

1int main() {2    int n = 5;3    printf("%d\n", n);4    return 0;5}
5變數n0回傳格式化輸出 (printf)%d\n,宣告int(整數)變數n=定義函式 回傳型別int(整數)main引入函式庫cstdio(C++ 標準輸入輸出)1234

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

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

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

⚠️ 而切到 C 之後那顆積木上會多幾格:它寫著「格式化輸出 " … "」 ——那個引號裡就是格式字串(下一節)。

而「建立 … 變數 …」那一顆從第 2 課到現在都沒變——換的是投影,不是它。

二、printf 的格式字串

C 沒有 cout,印東西用 printf:

1printf("%d\n", n);
變數n格式化輸出 (printf)%d\n,引入函式庫cstdio(C++ 標準輸入輸出)1
這一段 意思
"%d\n" 格式字串——%d 是「這裡放一個整數」
\n 換行(endl 的對應物)
n 要放進 %d 的東西

常用的幾個:

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

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

讀進來對應的是 scanf:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1scanf("%d", &n);      // ⚠️ 注意那個 &
變數n格式化輸入 (scanf)%d,引入函式庫cstdio(C++ 標準輸入輸出)1

積木盤上這一顆寫著「格式化輸入 (scanf)」。

那個 & 現在先照抄,第 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 的少,是它的設計。

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

完成的樣子

這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。

1#include <cstdio>2using namespace std;3int main() {4    int n = 5;5    printf("%d\n", n);6    return 0;7}
5變數n0回傳格式化輸出 (printf)%d\n,宣告int(整數)變數n=定義函式 回傳型別int(整數)main使用命名空間std引入函式庫cstdio(C++ 標準輸入輸出)123456

換你了

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

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

到編輯器做這一題:練習:把入門第 13 課貼進來,切到 C 看它變什麼

做一個

用 printf 印出三行算式:7 + 3 = 10 這樣的格式(和、差、積)。

🔴 一個 printf 裡要放三個 %d——那正是 cout 做不到的事: cout 把格式和值混在一起寫,printf 把格式抽成一個字串,值排在後面。 做完把同一件事用 cout 寫一次,兩份並排看。

到編輯器做這一題:做一個:用 printf 排一張算式表

這一課你做了什麼

如果卡住了

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