![](/img/trans.png)
[英]Why aren't we allowed to use even global const qualified variables in switch-case?IBM support portal hints we can
[英]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
語句將只是if
和else if
鏈的語法化版本。
switch
語句通常是實現有限狀態機(如解析器)的任何算法的核心,因此這是將其包含在語言中的一個很好的理由。 大多數現代的編譯器可能會為if
和else if
鏈生成相同的機器代碼,而if
和else 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.