跳轉到內容

Sway 參考手冊/條件語句

來自 Wikibooks,開放的世界,開放的書籍

條件語句在計算機程式中實現決策點。假設你有一個對影像執行某些任務的程式。你可能在程式中有一個點,你在影像為 JPEG 時執行一件事,在影像為 GIF 檔案時執行另一件事。很有可能,在這一點上,你的程式將包含一個條件表示式來做出這個決定。

在學習條件語句之前,瞭解邏輯表示式很重要。這樣的表示式是條件語句和迴圈[1]的核心。

邏輯表示式

[編輯 | 編輯原始碼]

邏輯表示式求值為一個真值,本質上是真或假。例如,表示式 x > 0 如果 x 為正則求值為真,如果 x 為負或零則求值為假。在 Sway 中,真由符號 :true 表示,假由符號 :false 表示。這兩個符號一起被稱為 _布林_ 值。


可以將真值賦給變數

     var z = c > 0;

這裡,如果 c 為正,則變數 z 的值為 :true;否則,它的值為 :false。

邏輯運算子

[編輯 | 編輯原始碼]

Sway 具有以下邏輯運算子。

   ==  equal to
   >=  greater than or equal to
   >   greater than
   <=  less than or equal to
   !=  not equal to
   &&  and
   ||  or

前五個運算子用於比較兩件事,而最後兩個運算子是將更簡單的邏輯表示式連線成更復雜的邏輯表示式的粘合劑。

短路求值

[編輯 | 編輯原始碼]

在計算邏輯表示式時,Sway 從左到右計算表示式,並在發現表示式絕對為真或絕對為假時停止計算。例如,遇到表示式

     x != 0 && y/x > 2

如果 x 的值為 0,則 && 連線符左側的子表示式將求值為假。此時,整個表示式不可能為真(因為 && 表示式要為真,左右兩邊都必須為真),因此不會計算表示式的右側。請注意,此表示式可防止出現除以零錯誤。

在 Sway 中,有兩種基本的結構用於在備選方案之間進行選擇。它們是 if-then-else 語句和 switch(或 case)語句。

If 表示式

[編輯 | 編輯原始碼]

Sway 的 _if_ 表示式用於根據稱為 _測試_ 表示式的真值有條件地執行程式碼。_if_ 的一個版本是在測試表達式後面有一個程式碼塊

以下是一個示例

   if (name == "John")
       {
       println("What a great name you have!");
       }

在此版本中,如果測試表達式為真(即字串“John”繫結到變數 _name_),則執行以下 _塊_(即列印敬語)。如果測試表達式為假,則不會執行以下塊。

與大多數程式語言不同,Sway 的 _if_ 是一個函式。在上面的示例中,兩個引數是測試表達式和後面的塊。後面的塊被稱為 _鄰近_ 塊。

這是 _if_ 的另一種形式

   if (major == "Computer Science")
       {
       println("Smart choice!");
       }
   else
       {
       println("Ever think about changing your major?");
       }

在此版本中,_if_ 接受三個引數:測試表達式和兩個後面的塊[2]。如前所述,如果測試表達式為真,則計算第一個塊。但是,如果測試表達式為假,則改為計算第二個塊。

請注意,任何鄰近引數必須是塊。雖然以下內容在某些語言中是合法的,但在 Sway 中會生成語法錯誤

   if (name == "John")
       println("What a great name you have!"); //not a block!

由於將單個表示式包裝在塊中可能被認為很乏味,因此你可以省略鄰近塊並對 _if_ 使用常規的函式呼叫語法

   if (a < b,min = a,min = b);   //find the minimum of two numbers

以上等效於

   if (a < b)
       {
       min = a;
       }
   else
       {
       min = b;
       }

請注意,如果你將表示式移入作為常規引數,則需要在閉合括號後使用分號,就像任何其他函式呼叫一樣。

函式 _if_ 與 Sway 中的任何其他函式一樣具有返回值。實際上,你可以使用返回值來簡化上面的表示式

   min = if (a < b) { a; } else { b; };

   min = if (a < b,a,b);

如果你使用 if 的返回值,則必須在表示式末尾使用分號,無論你是否使用鄰近塊。

請記住,如果你單獨使用 _if_ 且 if 具有鄰近塊,則不要在表示式末尾使用分號。否則,在包含 _if_ 的整個表示式末尾需要使用分號。

你可以將 _if 表示式_ 連線在一起,如下所示

   if (bases == 4) { println("HOME RUN!!!"); }
   else if (bases == 3) { println("Triple!!"); }
   else if (bases == 2) { println("double!"); }
   else if (bases == 1) { println("single"); }
   else { println("out"); }

如前所述,最終計算的塊的值是整個結構的返回值。如果沒有計算任何塊,則返回值為 :false。

連線的 _if_ 與一系列非連線的 _if_ 之間有什麼區別?例如,

   if (bases == 4) { println("HOME RUN!!!"); }
   if (bases == 3) { println("Triple!!"); }
   if (bases == 2) { println("double!"); }
   if (bases == 1) { println("single"); }
   else { println("out"); }

答案留給讀者作為練習。

Switch 表示式

[編輯 | 編輯原始碼]

上面的 if 鏈可以使用 _switch_ 表示式改寫

  var x = 0;
  
  switch (x)
      {
      case(4) { println(x,"HOME RUN!!!"); }
      case(3) { println("Triple!!"); }
      case(2) { println("double!"); }
      case(1) { println("single"); }
      else    { println("out"); }
      }

如果 switch 表示式(在本例中為 _x_)與任何 case 表示式(在本例中為 4、3、2 和 1)匹配,則計算與匹配的 case 相對應的塊。

在像 C 這樣的語言中,switch 語句比等效的 if 鏈更有效。在 Sway 中,並非如此。實際上,switch 的效率(不)相當,但通常看起來更令人賞心悅目。與要求 switch 和 case 表示式為整數並在編譯時已知的 C 不同,Sway 的 switch 更加靈活,因為兩種表示式都可以是任何有效的 Sway 表示式,包括變數。

要使用 _switch_,你需要包含 _**basics**_ 庫。要使用“basics”庫,請在原始碼檔案頂部新增以下函式呼叫

   include("basics");

在原始碼檔案的頂部。

與 _if_ 一樣,switch 也是一個具有鄰近塊引數的函式。本身,帶有鄰近塊的 switch 呼叫沒有終止分號。與 _if_ 一樣,switch 也是一個具有鄰近塊引數的函式。本身,帶有鄰近塊的 switch 呼叫沒有終止分號。在所有其他情況下,需要使用分號。

  1. 我們將在下一章學習迴圈。
  2. _else_ 只是為了美觀而存在,被稱為“語法糖”。


除錯 · 迴圈

華夏公益教科書