同一份程式,兩種說法
切一次目標,看同一段語義變成另一種語言。 · ⏱ 約 25 分鐘
你會學到三件事
- C 和 C++ 在這個工具裡是同一棵語義樹的兩種投影
printf 和 cout 說的是同一件事
- 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 << endl 和 printf("%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 少掉的那五樣東西,接下來要一個個處理
如果卡住了
| 你看到 |
多半是因為 |
| 切過去之後有些積木變灰 |
那些是 C 沒有的概念 |
printf 印出奇怪的數字 |
%d 的數量和參數對不上 |
scanf 沒有反應 |
少了 & |
| 中文印出亂碼 |
%s 和多位元組字元——這一課先用英文 |
在編輯器打開這一課 →