簡體   English   中英

為什么不能在switch構造的案例中使用變量?

[英]Why can't we use variables inside a case in switch construct?

如果我有一個像int a=4這樣的整數變量,那么在切換的情況下如果我寫

int b = something;
...
switch(a) 
{ 
  case 4+b: printf("hii"); 
} 

那么,為什么該語句是一個編譯時錯誤,即在case語句中不能使用變量,為什么編譯器沒有用值代替變量。

因此,從根本上講,它會產生什么問題,而語言開發人員並未為此提供適當的語法。

switch控制流語句的最初思想是,它應該非常快地確定適當的情況,同時可能會有很多情況。

傳統的實現將使用跳轉表,使其成為O(1)操作。 跳轉表本質上是一個指針數組,其中每個指針包含每種case第一條指令的地址。 跳轉到適當的case就像用switch值索引該數組然后對該地址執行jump指令一樣簡單。

如果允許這些情況包含變量,則編譯器將必須發出代碼,該代碼首先對這些表達式求值,然后將switch值與一個以上的其他值進行比較。 如果是這樣,那么switch語句將只是ifelse if鏈的語法化版本。

switch語句通常是實現有限狀態機(如解析器)的任何算法的核心,因此這是將其包含在語言中的一個很好的理由。 大多數現代的編譯器可能會為ifelse if鏈生成相同的機器代碼,而ifelse if只是針對一個常數測試變量,但是在1970年代初構思C時情況並非如此。 而且, switch使您能夠掉線,這在后一種安排中是不可能的。

case 2+a: doSomething();
          break:
case 4-a: doSomethingElse();
          break;

a==1時,您會怎么做?

有幾種可能的答案,包括

  • 按順序運行所有適用的情況
  • 以任意順序運行所有適用的情況
  • 運行第一個適用案例
  • 運行任何一種適用情況
  • 行為是不確定的
  • 引發明確的錯誤

問題是,沒有一項決議比其他決議更可取。 而且,所有這些都與switch語句的原始簡單原理背道而馳,switch語句為快速,預先計算的索引跳轉表提供了較高的抽象級別。

因為它通常是多余的,並且在編譯器級別,您希望跳轉到固定地址。 只需將變量的依賴項放在switch表達式中

switch(a-b) 
{ 
  case 4: printf("hii"); 
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM