計算機程式設計/控制
條件語句
[編輯原始碼]條件子句是程式碼塊,只有當特定表示式(條件)為 真 時才會執行。
if-else
[編輯原始碼]if-else 語句是最簡單的條件語句。它們也被稱為分支,因為當程式在執行期間到達 if 語句時,控制權將“分支”到兩個或多個“方向”中的一個。if-else 語句通常採用以下形式
if (condition):
statement
else:
other statement
如果滿足原始條件,則執行第一個語句中的所有程式碼。可選的 else 部分指定了一個備用語句,如果條件為假,則執行該語句。確切的語法在不同的程式語言中會有所不同,但大多數程式語言(尤其是 過程式 和 結構化 語言)都會內建某種形式的 if-else 條件語句。if-else 語句通常可以擴充套件到以下形式
if (condition):
statement
else if (condition):
other statement
else if (condition):
other statement
...
else (condition):
another statement
整個塊中只執行一個語句。這個語句將是第一個條件為真的語句。藉助示例,可以更容易地理解 if-else-if 結構的概念
if (temperature is equal to or greater than 40 degrees celsius):
print "It's extremely hot"
else if (temperature is between 30 and 39 degrees):
print "It's hot"
else if (temperature is between 20 and 29 degrees):
print "It's warm"
else if (temperature is between 10 and 19 degrees):
print "It's cool"
else if (temperature is between 0 and 9 degrees):
print "It's cold"
else:
print "It's freezing"
最佳化提示
[編輯原始碼]當這個程式執行時,計算機將按順序檢查所有條件,直到其中一個條件與其對真的概念匹配。一旦發生這種情況,程式將執行緊跟在條件後面的語句並繼續,而不會檢查任何其他條件。出於這個原因,當您嘗試 最佳化 程式時,最好按照降序 機率 排序您的 if-else 條件。這將確保在最常見的情況下,計算機需要做的工作更少,因為它很可能只需要檢查一兩個“分支”就能找到它應該執行的語句。但是,在第一次編寫程式時,儘量不要考慮太多,以免發現自己進行了 過早最佳化。
話雖如此,您應該知道,當所討論的語句沒有 副作用 時,最佳化編譯器 可能會隨意重新排列您的 if 語句。除了其他技術之外,最佳化編譯器甚至可能會應用 跳轉表 和 二分查詢。
case
[編輯原始碼]通常有必要將一個特定變數與多個常量表達式進行比較。對於這種條件表示式,存在 case 語句。例如
case X :
when 1 :
Walk_The_Dog;
when 5 :
Launch_Nuke;
when 8 or 10 :
Sell_All_Stock;
when others :
Self_Destruct;
esac;
無條件語句
[編輯原始碼]無條件語句允許您在沒有條件的情況下改變程式的流程。使用無條件語句時要小心。通常它們會使程式難以理解。閱讀 goto 邪惡嗎? 獲取更多資訊。
return
[編輯原始碼]結束函式並返回到呼叫過程或函式。
對於過程
return
對於函式
return Value
goto
[編輯原始碼]Goto 將控制權轉移到標籤後面的語句。
goto Label Dont_Do_Something; Label :
goto 邪惡嗎?
[編輯原始碼]自從 Dikstra 教授發表了他的文章 關於 Go To 語句的思考 以來,goto 在結構化程式語言中被認為是不好的做法,事實上,許多程式設計風格指南禁止使用 goto 語句。但經常被忽略的是,任何不是過程或函式中最後一個語句的返回也是無條件語句——一種偽裝的 goto。不過有一個重要的區別:返回是 goto 的一種僅向前使用。異常也是一種 goto 語句;注意它們不需要指定要去哪裡。
因此,如果您有包含多個 return 語句的函式和過程,您就會破壞程式的結構,類似於使用 goto。在實踐中,幾乎每個程式設計師都熟悉 'return' 語句及其相關行為;因此,在可讀性方面,以下兩個示例幾乎相同
還要注意,Ada 中的 goto 語句比其他語言中的更安全,因為它不允許您將控制權
- 轉移到主體之外;
- 在 case 語句、if 語句或 select 語句的不同備選方案之間;
- 在不同的異常處理程式之間;或者從已處理_語句序列的異常處理程式返回到其語句序列。
procedure Use_Return Do_Something if Test : return Do_Something_Else return end
procedure Use_Goto Do_Something if Test : goto Exit Do_Something_Else Exit : return end
由於使用 goto 需要宣告標籤,因此 goto 的可讀性實際上是 return 的兩倍。因此,如果可讀性是您的關注點,而不是嚴格的“不要使用 goto”程式設計規則,那麼您應該使用 goto 而不是多個 return。當然,最好的方法是結構化方法,不需要 goto 也不需要多個 return
procedure Use_If
Do_Something;
if not Test :
Do_Something_Else;
fi;
return
end
迴圈
[編輯原始碼]迴圈允許您重複執行一組語句。
無限迴圈
[編輯原始碼]無限迴圈是一個永遠不會結束的迴圈,迴圈內的語句會永遠重複。術語“無限迴圈”是一個相對術語;如果正在執行的程式被一些超出程式控制範圍的方式強行終止,那麼無限迴圈確實會結束。
loop : Do_Something; repeat
開頭帶條件的迴圈
[編輯原始碼]此迴圈在開頭有一個條件。只要滿足條件,這些語句就會重複執行。如果一開始條件不滿足,那麼迴圈內的語句永遠不會執行。
while (X < 5) : let X := Calculate_Something repeat
結尾帶條件的迴圈
[編輯原始碼]這種迴圈的條件在末尾,語句會重複執行,直到條件滿足。由於檢查是在末尾進行的,因此語句至少會執行一次。
loop
X := Calculate_Something
until (X > 5)
帶中間條件的迴圈
[編輯原始碼]有時需要先進行計算,並在滿足特定條件時退出迴圈。但是,如果條件不滿足,則需要做其他事情。因此,你需要一個在中間設定退出條件的迴圈。
loop X := Calculate_Something if X > 5 : exit Do_Something (X) repeat
for 迴圈
[編輯原始碼]通常情況下,需要一個迴圈,將特定變數從給定的起始值向上或向下計數到特定結束值。你可以在這裡使用 while 迴圈 - 但由於這是一個非常常見的迴圈,因此可以使用更簡單的語法。
for I := 1 to 10 : Do_Something (I) repeat
陣列上的 for 迴圈
[編輯原始碼]另一種非常常見的情況是,需要一個迴圈,它遍歷陣列中的每個元素。以下示例程式碼展示瞭如何實現這一點。
for-each I in X :
X [I] := Get_Next_Element;
repeat