在c語言中switch語句會被實現為乙個跳轉表,跳轉表是乙個陣列,這個陣列裡面存的都是位址,也就是說只要你傳遞給它乙個i,他就會返回給你,你所需要跳轉的位址,這樣做得好處就是執行語句的時間和條件的個數無關..不過在gcc裡面他也只是條件數大於4個,才會生成這個跳轉表.
請看下面的**:
[code]int switch_eg(int x)
return result;
} [/code]
這只是一段簡單的switch語句,下面我們用一段c**來描述彙編**所要做得事情.
[code]code *jt[7] = ;
int switch_eg_impl(int x)
[/code]
看上面的**就很清楚了,它會對傳進來的值與100進行乙個減法,然後再將這個值傳進switch語句.
而真實的彙編**是怎麼樣的呢,我們可以看看:
[code]switch_eg:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax //這邊得到傳進來的引數
leal -100(%eax), %edx //這邊將得到的引數和100做差
cmpl $6, %edx //這邊和6比較,如果大於6說明下面的條件沒有滿足的所以預設進入default
jbe .l11
.l2:
popl %ebp
xorl %eax, %eax
ret.p2align 4,,7
.l11:
jmp *.l7(,%edx,4) //這邊也就是我們上面偽碼所描述的那個jt[xi]
.section .rodata
.align 4
.align 4
.l7: //這邊就是所構造的跳轉表.
.long .l3
.long .l2
.long .l4
.long .l5
.long .l6
.long .l2
.long .l6
.text
.l6: // loc_d
imull %eax, %eax
popl %ebp
.p2align 4,,6
ret.l5: //loc_c
popl %ebp
movl $114, %eax
.p2align 4,,6
ret.l4: //loc_b
popl %ebp
movl $123, %eax
.p2align 4,,4
ret.l3: //loc_a
popl %ebp
movl $1300, %eax
.p2align 4,,4
ret[/code]
C語言中switch語句
在多分支選擇中,用if語句程式會冗長,可讀性低,用switch更合適。switch語句格式 switch 表示式 注意 1 當 表示式 與 各個常量 都不匹配時執行default後的語句n,也是可有 可無 2 switch後面括號裡的 表示式 的值為整型或字元型 3 若沒有default時,swit...
C語言中的switch詳解
switch語句 c語言中實現多分支選擇的語句 例 輸入乙個分數等級,輸出對應分數 switch grade 注 switch 括號中值的型別是整型 包括字元型 grade在這兒是字元型別。case標號只起乙個標記的作用,沒有條件檢查的功能,程式執行時,根據switch 中的值,找到與其相同的cas...
C 語言中switch模組case default
package flowcontrol 1.2.publicclass switchcase 15.16.17.last default 18.publicstaticvoid testlast int i 29.30.31.middle default 32.publicstaticvoid te...