做決定:如果這樣,就那樣
到目前為止,程式可能感覺像一份食譜,永遠按同樣的順序做完全一樣的步驟。但現實生活不是這樣——如果下雨你就帶傘,否則就把傘留在家裡。條件(conditional)就是你給程式裝上這種常識的方式:它看看某件事是不是真的,然後挑一條路走。
在程式碼裡,這幾乎總是用 if(如果)和 else(否則)這兩個詞。你寫下 `if`,後面跟一個只能回答「是」或「否」的問題——比如「分數高於 60 嗎?」——再寫上答案為「是」時要做的那段事。`else` 部分是可選的:它是墊底,也就是答案為「否」時該做什麼。
if (score >= 60) {
print("You passed!")
} else {
print("Try again.")
}重複:再做一次,再做一次
電腦最擅長的就是毫無怨言地做枯燥的事。假設你要給 500 個人寄同一封郵件,你絕不會手動複製貼上 500 次——你也不需要。迴圈(loop)就是那個會說「把這個動作一遍又一遍地做」的工具,於是你只寫一次步驟,電腦就替你重複。
迴圈有兩種日常的口味。第一種是每一項重複一次——「清單上的每個名字,都寄一封郵件」。第二種是重複到某個條件讓它停——「只要收到的密碼是錯的,就一直要求重新輸入」。兩者共享同一種心跳節奏:做事、檢查要不要再來一次、做事、再檢查。
逐項走過一份清單
大多數時候你之所以要迴圈,是因為你手上有一堆東西要處理。在程式碼裡,這樣一組有順序的東西叫陣列(array)——把它想像成一排帶編號的盒子,每個盒子裡裝著一個值。你最常寫的迴圈,就是從第一個盒子走到最後一個盒子,在每一站做一件小事。
fruits = ["apple", "pear", "plum"]
for fruit in fruits {
print("I have a " + fruit)
}把那行 `for ... in ...` 大聲讀成「對 fruits 裡的每個 fruit」。`fruit` 這個詞是一個臨時標籤,每轉一圈就指向其中一項——先是「apple」,然後「pear」,再然後「plum」。你只寫一次迴圈體,迴圈每一圈都貼心地替你換上下一項。這就是全部的訣竅,而你會不停地用到它。
新手最常踩的坑
有兩個錯誤幾乎人人在早期都會撞上,所以現在認出它們,能省下你以後好幾個小時。第一個是差一(off-by-one)錯誤。它通常在你自己數位置、而不用 `for each` 時發作,因為在大多數語言裡,陣列的第一個盒子編號是 0,不是 1——所以一份 3 項的清單,位置是 0、1、2。去拿位置 3 會什麼都拿不到,或者直接當掉。
第二個坑是無窮迴圈(infinite loop):一個永遠停不下來的重複,因為你讓它等的那個條件永遠不會變成真。想像你對朋友說「一直走到你看見紅色的門為止」,可根本沒有紅色的門——他就會永遠走下去。在程式碼裡,迴圈就一直空轉,程式卡死,你的風扇開始狂轉。
小結
你剛剛認識了兩個概念,它們能把一串平鋪直敘的指令,變成會思考、會行動的東西。條件負責決定——它問一個「是/否」問題,然後挑一條路。迴圈負責重複——每項一次,或者直到某個條件叫停。
你最常寫的套路,就是把這兩者合在一起:走過一個陣列,並在迴圈內部用一個 `if` 來決定怎麼處理每一項。留心「差一」和「無窮迴圈」這兩個坑,永遠先問「是什麼讓它停?」,你手裡就已經握住了相當可觀的一大塊程式設計能力。