[初章] 第一幕、請示主人從主命
Tags
- 初章
主人主人~晚餐想吃什麼呢?
主人辛苦了!要不要來杯茶休息一下呢?
主人主人、這些東西還要嗎?可不可以丟掉呢?
主人~(下略百萬字)
也許你覺得很吵雖然可愛就沒問題
但你不會希望發生這樣的事:
我們創造一位打掃用的女僕。
她只能打掃客廳。
如果你希望她也打掃你的房間,
那就只好另外創造一位女僕,
她只能打掃客廳,以及你的房間。
而且你無法要她只打掃客廳。
只會說話是不夠的。
他還不能接收我們的指示。
不管你說什麼做什麼,他都感受不到。
不管是什麼樣的關係,主從也好、伴侶也好。
雙向的思念傳達是最重要的。
上一幕我們成功讓使魔學會表達,
而且是以我們能夠感受到的方式。
該是時候補上最後一塊拼圖了。
由於文字的處理相當複雜,
我們從最基本的十進位整數開始。
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main()
{
int num;
scanf("%d", &num);
printf("Master, do you mean %d?\n", num);
return 0;
}
咒文一下子變得複雜又電波了。
沒關係,我們照順序來。
聽過『左耳進右耳出』『馬耳東風』『耳邊風』之類的詞嗎?
是的。單是聽到主人說的話,一點意義都沒有。
聲音一去不復返,船過水無痕。
我們得命令使魔將這些話記住才行。
我們所聽過的話語,
自然便會記下,或者留有一些印象。
或者選擇性地記憶和遺忘。
儘管對我們而言再自然不過的事,
也可能對使魔是極困難而複雜的事。
希望你可以花些心思理解使魔的特性,
體諒他們和人類的不同之處。
為此,我們必須先學習對使魔的記憶操作。
int num;
在使魔的記憶中,刻下名為 num 的整數。
就像我們可能在記憶中刻下:
坐隔壁女孩子的電話號碼、
下個月新作發售日、
還有幾堂課才要放學…等。
- 正式名稱為『變數』的『宣告』。
- int 代表我要刻在心中的記憶,是個 integer(整數)。
- num 代表這個整數的名稱 (註1) 或意義為 num。
雖然名稱可以自行決定,而且意義不大,
但會相當程度影響咒文易讀不易讀,
進一步影響出錯時是否容易處理。
不適當的命名容易在閱讀時,令人感到混亂。
亂取也不會有人責怪,但是最後痛苦的通常是自己。
有了記憶,接下來就是接收主人的指示了。
scanf("%d", &num);
向主人請示一個十進位整數,記到 num 去。
在這一行,使魔會停下來請求指示,
直到收到指示後 (註2),才會繼續動作。
%d 也是一個暗號,代表的是一個十進位整數;
而且它在 printf 之中也通用 (註3)。
最後,為了確認使魔是否正確地接收,
並且牢牢地記住,我們讓他輸出剛剛接收的整數。
printf("Master, do you mean %d?\n", num);
最後,我們整理一下所有要做的事:
- 讓使魔請示主人給予一個十進位整數
- 為了讓使魔記住,所以需要記憶
- 為了確認使魔有沒有好好記住,需要表達
由於 C 是依照順序由上到下執行的,
一條指令執行完後才會執行下一條,
因此正確的順序非常重要。
所以我們整理一下:
- 表達要在我們給予指示之後,才知道要表達的內容
- 給予指示必須先有記憶,才能記住
得到的順序是:
- 先有記憶
- 再請示主人
- 最後告知請示的結果
最後再將它們依序不可逆不可拆寫成咒文:
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main()
{
int num;
scanf("%d", &num);
printf("Master, do you mean %d?\n", num);
return 0;
}
並且試試看使魔有沒有乖乖聽話,
有的話記得給予獎勵喔!
-
儘管可以自行對記憶進行命名,
規格上命名時只能使用:- 半形底線 『
_
』 - 半形英文大小寫字母
- 半形數字
並且數字不得作為開頭第一個字。
補充:
較新的標準(C99 標準)下,
允許使用中文字或其它字來命名,
但是在 Dev-CPP 開發環境下,
以及部份環境下還不支援這件事。 - 半形底線 『
-
停下來等候指示時,
並不會主動催促或說明他需要什麼樣的指示,
只會默默地等。因為自己就是主人,原本就知道使魔何時會等、
以及在等什麼、等的意義何在。
如果有要分享給朋友等無知的第三者的話,
建議讓使魔在等候指示之前,
先表達自己在等什麼樣的指示比較好。 -
scanf 和 printf 其實是由 scan / print
最後加上 f 修飾而成。這裡的 f 指的是 format 的意思,
也就是說它們接受 format string (格式化字串),『格式化字串』代表我們給它的文字列,
並非單純的文字,而是作為樣板、模板的存在;
可以包含 %d 這類特定暗號,
讓它幫你照著暗號定義來做額外處理。printf 會印出 formatted string (格式化後的結果);
也就是幫你把暗號置換成你想插入的內容。
本篇的例子是將 %d 置換為一個整數數字,
而數值則是從額外提供的 num 記憶中拿取的數字。scanf 則是把相對應的資料記在我們指定的記憶之中。
本篇的例子就是讀入一個整數,
並透過 &num 指定要記入哪一個記憶。我想也許樣板或格式化字串,大家接觸的例子比較少。
如果說樣板和置換,一時難以體會的話,
底下是從英雄聯盟隨便找的例子來改造:卡特蓮娜化身成刀刃颶風,最多持續 %duration 秒。
期間內高速向周圍最多 %target_limit 個敵方英雄投擲匕首,
最多造成 %spell_damage 點魔法傷害。被此技能擊中的目標將降低 %debuff_power%% 所受的治療效果,
持續 %debuff_duration 秒。- 冷卻:%cooldown 秒
- 射程:%range
或者幹你娘○爆系列也是類似的例子。