主人主人~晚餐想吃什麼呢?
主人辛苦了!要不要來杯茶休息一下呢?
主人主人、這些東西還要嗎?可不可以丟掉呢?
主人~(下略百萬字)

也許你覺得很吵雖然可愛就沒問題
但你不會希望發生這樣的事:

我們創造一位打掃用的女僕。
她只能打掃客廳。

如果你希望她也打掃你的房間,
那就只好另外創造一位女僕,
她只能打掃客廳,以及你的房間。

而且你無法要她只打掃客廳。

只會說話是不夠的。
他還不能接收我們的指示
不管你說什麼做什麼,他都感受不到。

不管是什麼樣的關係,主從也好、伴侶也好。
雙向的思念傳達是最重要的

上一幕我們成功讓使魔學會表達,
而且是以我們能夠感受到的方式。
該是時候補上最後一塊拼圖了。

由於文字的處理相當複雜,
我們從最基本的十進位整數開始。

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. 最後告知請示的結果

最後再將它們依序不可逆不可拆寫成咒文:

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;
}

並且試試看使魔有沒有乖乖聽話,
有的話記得給予獎勵喔!

  • *註1

    儘管可以自行對記憶進行命名,
    規格上命名時只能使用:

    • 半形底線 『_
    • 半形英文大小寫字母
    • 半形數字

    並且數字不得作為開頭第一個字

    補充:

    較新的標準(C99 標準)下,
    允許使用中文字或其它字來命名
    但是在 Dev-CPP 開發環境下,
    以及部份環境下還不支援這件事。

  • *註2

    停下來等候指示時,
    不會主動催促或說明他需要什麼樣的指示
    只會默默地等。

    因為自己就是主人,原本就知道使魔何時會等、
    以及在等什麼、等的意義何在。
    如果有要分享給朋友等無知的第三者的話,
    建議讓使魔在等候指示之前,
    先表達自己在等什麼樣的指示比較好。

  • *註3

    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

    或者幹你娘○爆系列也是類似的例子。