編譯器

運算式 2 + 3 * 4 的抽象語法樹之形狀,下列何者正確?

  1. A根節點是 + 的節點,其右子節點是表示 3 * 4 的 * 節點
  2. B根節點是 * 的節點,其左子節點是表示 2 + 3 的 + 節點
  3. C2、3、4、+、* 這5個節點全部並列為根節點的直接子節點
查看答案與解析

正確答案:A. 根節點是 + 的節點,其右子節點是表示 3 * 4 的 * 節點

乘法的優先順序高於加法,所以此運算式會被解釋為 2 + (3 * 4)。在抽象語法樹中,越先計算的運算會放在越下面,所以根節點是 +,其左子節點是2,右子節點是以3和4為子節點的 * 節點。若由下往上對樹求值,會先計算 3 * 4 = 12,再得到 2 + 12 = 14。根節點成為 * 的是寫成 (2 + 3) * 4 的情況,而把全部並列在根節點之下,則無法表示計算的順序。

  • A. 正確。優先順序較高的 * 在下面,根節點是 +。
  • B. 根節點成為 * 的是 (2 + 3) * 4 的情況。
  • C. 若平鋪並列,就無法表示計算的順序。
練習這個領域 前往領域頁面

編譯器的其他題目

  1. 關於中介表示之一的三位址碼(three-address code)的特徵,下列何者正確?
  2. 作為暫存器配置的準備而進行的存活區間(liveness)分析,所求的是下列何者?
  3. 某函式中,同時存活的值之數量在最多的地方是5個。在干涉圖除了這5個之外不產生其他限制的單純情況下,要讓所有值不溢出就放入暫存器,暫存器至少需要幾個?
  4. 將重複100次的迴圈,改寫成將主體並排4次份的迴圈展開,次數的判斷與分支會變成幾次?(假設100可被4整除)
  5. 從C語言的程式到產生執行檔的一般流程,下列何者正確?

這個領域的比較