高效的C編程之:Switch語句

2020-12-12 電子產品世界

編譯器通常將C語言中的Switch語句編譯一個查找表(TableLookup)以便跳轉到合適的入口處。

本文引用地址:http://www.eepw.com.cn/article/257019.htm

下面的例子顯示了編譯器如何處理程序中的Switch語言的。

C源程序如下。

char*ConditionStr1(intcondition)

{

switch(condition)

{

case0:returnEQ;

case1:returnNE;

case2:returnCS;

case3:returnCC;

case4:returnMI;

case5:returnPL;

case6:returnVS;

case7:returnVC;

case8:returnHI;

case9:returnLS;

case10:returnGE;

case11:returnLT;

case12:returnGT;

case13:returnLE;

case14:return;

default:return0;

}

}

編譯後的結果如下。

ConditionStr1:

0000807CE1A01000MOVr1,r0

>>>SWITCH\#3switch(condition)

00008080E351000ECMPr1,#0xe

00008084908FF101ADDLSpc,pc,r1,LSL#2

00008088EA00003BB0x817cSWITCH\#20>

0000808CEA00000DB0x80c8SWITCH\#5>

00008090EA00000FB0x80d4SWITCH\#6>

00008094EA000011B0x80e0SWITCH\#7>

00008098EA000013B0x80ecSWITCH\#8>

0000809CEA000015B0x80f8SWITCH\#9>

000080A0EA000017B0x8104SWITCH\#10>

000080A4EA000019B0x8110SWITCH\#11>

000080A8EA00001BB0x811cSWITCH\#12>

000080ACEA00001DB0x8128SWITCH\#13>

000080B0EA00001FB0x8134SWITCH\#14>

000080B4EA000021B0x8140SWITCH\#15>

000080B8EA000023B0x814cSWITCH\#16>

000080BCEA000025B0x8158SWITCH\#17>

000080C0EA000027B0x8164SWITCH\#18>

000080C4EA000029B0x8170SWITCH\#19>

對於ARM代碼,查找表的入口為4位元組;Thumb代碼的查找表入口為1或2個字節(當Case情況小於32時,使用入口為1位元組的查找表)。所以當使用Switch語句時,應儘量較少Case分支。

另外,為了提高系統性能,也可以手工編寫代碼,形成程序跳轉來避免使用Switch語句。

下面的例子顯示對上面Switch分支語句的改寫。

char*ConditionStr2(intcondition)

{

if((unsigned)condition>=15)return0;

return

EQ\0NE\0CS\0CC\0MI\0PL\0VS\0VC\0HI\0LS\0GE\0LT\0GT\0LE\0\0+

3*condition;

}

編譯後的代碼如下所示。

ConditionStr2:

00008188E1A01000MOVr1,r0

>>>SWITCH\#26if((unsigned)condition>=15)return0;

0000818CE351000FCMPr1,#0xf

000081903A000001BCC0x819cSWITCH\#27>

>>>SWITCH\#26if((unsigned)condition>=15)return0;

00008194E3A00000MOVr0,#0

>>>SWITCH\#30}

00008198E12FFF1EBXr14

>>>SWITCH\#26if((unsigned)condition>=15)return0;

>>>SWITCH\#27return

0000819CE28F005CADRr0,{pc}+0x64;#0x8200

000081A0E3A02003MOVr2,#3

000081A4E0200291MLAr0,r1,r2,r0

000081A8EAFFFFFAB0x8198SWITCH\#30>

>>>SWITCH\#33{

從兩段彙編代碼的分析可以看出,使用跳轉表需要240bytes,而第二種做法只用了72bytes。

相關焦點

  • 關於C語言Switch語句,先學這些技巧夠不夠?
    case常量表達式"只是起語句標號作用,並不是在該處進行條件判斷.在執行swith語句時,根據switch後面表達式的值找到匹配的入口標號,就從此標號開始執行下去,不再進行判斷.例如,上面的例子中,若grade的值等於'A',則將連續輸出:因此,應該在執行一個case分支後,使流程跳出switch結構,即終止switch語句的執行.
  • 編程入門第六課,交換語句(switch,case)
    介紹1.1 介紹上一課我們學會了循環語句(for,while)的編程技巧,這使得我們可以開發比較複雜的程序了。今天福哥會給童鞋們講講交換語句(switch,case)的使用方法,交換語句適合對一個變量的值等於不同內容的時候進行不同處理的情況。
  • C語言switch語句用法總結
    對於switch語句你都學會使用了嗎?本文將總結switch語句基本用法及使用技巧,希望能給大家提供參考。1、 switch語句基本用法C語言中,switch語句是一種多分支選擇語句,在實際應用中,要在多種情況中選擇一種情況,執行某一部分語句。
  • [GO語言基礎] 五.順序控制語句和條件控制語句(if、else、switch)
    因此從今天開始從零講解Golang程式語言,一方面是督促自己不斷前行且學習新知識;另一方面是分享與讀者,希望大家一起進步。前文介紹了Golang的運算,包括算術運算、邏輯運算、賦值運算、位運算及編程練習。這篇文章將詳細講解順序控制語句和條件控制語句。這系列文章入門部分將參考「尚矽谷」韓順平老師的視頻和書籍《GO高級編程》,詳見參考文獻,並結合作者多年的編程經驗進行學習和豐富,且看且珍惜!
  • C語言——選擇結構設計(switch語句和關係運算符及關係表達式)
    在此之前我們介紹了if選擇結構,當然了if並不能解決所有的選擇問題,例如,將學生的成績分等,按優,,良,一般這樣分的話,顯然if語句就顯得力不從心了,那麼在這時候我們就應該使用switch語句去進行操作。switch語句是多分支選擇語句,用來實現分等等問題。
  • 學習編程道路上的入門書籍之C篇
    學習編程專欄連載編程學習編程道路上的入門書籍之C篇,此篇內容將包含一些算法以及數據結構相關內容,文章中的所有推薦的書籍均來自知乎社區大牛力薦書籍、豆瓣評分較高書籍、各語言社區比較熱門書籍以及京東、亞馬遜、噹噹熱銷書籍的重合書籍。
  • C語言中Switch語句在單片機編程中的使用
    C語言還提供了另一種用於多分支選擇的switch語句, 其一般形式為:switch(表達式){     case 常量表達式1:
  • C語言switch語句
    1.執行流程首先計算表達式的值,當表達式的值與某個常量的值相等,則以該常量後邊的語句作為入口開始執行下邊的語句,如果沒有常量值與表達式的值相等,則執行default後的語句.註:1.switch關鍵字後的表達式通常是整型的或者字符型的2.可以在每個case後的執行語句的結尾使用break語句,break語句的作用是跳出switch結構3.如果某個case後的執行語句有多餘,可以不用加{}括起來if語句和switch
  • 語句介紹之switch語句
    結構化程序設計有三種結構:順序結構,選擇結構和循環結構if語句和switch語句可以構成選擇結構。
  • C語言|switch語句的使用
    switch根據其中break語句的使用方法,一般分為三種情況。1. 在switch語句的每個語句段中都使用break語句。有default時,如果表達式的值與任何一個常量表達式的值都不想等,則執行default後面的語句段。如果省略了default,那麼當表達式的值與任何一個常量表達式的值都不相等時,就什麼都不執行。2. 在switch語句中不使用break語句。
  • switch語句的使用方法
    使用if語句嵌套解決實際問題中的多分支選擇時,如果分支數目非常多,那麼if語句的嵌套層數也會很多,使得程序代碼變得冗長而且可讀性會下降。C語言提供了switch語句來處理多分支選擇。switch語句的語法形式如下:switch(表達式){case 常量1: 語句或語句組1;case 常量2: 語句或語句組2;……case 常量n: 語句或語句組
  • 為什麼Python中沒有switch語句?
    不同於我用過的其它程式語言,Python 沒有 switch / case 語句。官方文檔的解釋說,「用if... elif... elif... else序列很容易來實現 switch / case 語句」。而且可以使用函數字典映射和類的調度方法。可以說官方的說明並沒有解釋什麼,只是給出了解決方案。換句話說,沒有回答為什麼。我認為其實官方真正想說的是:「Python 不需要 switch / case 語句」。是的。但是還有別的原因。
  • C語言程序控制語句——switch
    ANSI C基礎知識內容:switch語句申明:該系列文檔僅供個人學習使用,轉載請註明出處©switch語句用來實現多分枝選擇程序控制,根據表達式的值,決定case後面操作是否執行。switch(表達式){case 常量表達式1:語句1case 常量表達式2:語句2┇case 常量表達式n:語句ndefault: 語句n+1}說明:switch後面括號內的表達式,可以是任何類型。
  • Python 為什麼不支持 switch 語句?
    有些同學可能會第一時間想到它……喂喂,麻煩收收心,別總想著遊戲啦,我們要說的是程式語言中的 switch 語句。PEP-3103 是在 2006 年提出的,PEP-275 則是在 2001 年提出的,它們的共同之處是提出了引入 switch 語句的某種必要性、分析了好幾種備選的實現方案,然而,結局是都被拒絕了。
  • 模擬男程式設計師的約會時間表,深度理解if語句與switch語句的差異
    利用javascript程式語言,模擬戀愛中男程式設計師的約會時間表,深度理解if語句與switch語句的差異。在javascript編程中,流程制語句if與switch,是兩個非常重要的編程語句,也是有著密切關係的編程語句。
  • 物聯網開發筆記——嵌入式開發之Linux系統中C語言分支判斷語句
    具體查看《嵌入式開發之Linux系統中C語言運算符》。B、表達式也可以是任意類型(包括整型、實型、字符型、指針類型),具體查看《嵌入式開發之Linux系統中C語言數據類型》。3)branch/if-else.c例子
  • 51系列單片機學習5—C編程程序語句
    3: 語句 3; break;case 常量表達式 n: 語句 n; break;default: 語句  }  運行中 switch 後面的表達式的值將會做為條件,與 case 後面的各個常量表達式的值相 對比,如果相等時則執行 case 後面的語句,再執行
  • 用Object鍵值替換switch語句
    在許多程式語言中,switch語句存在 - 但是它應該更長嗎?如果你是一個JavaScript程式設計師,你經常跳進和跳出對象,創建,實例化和操作它們。對象非常靈活,它們是JavaScript中幾乎所有內容的核心,使用它們代替switch語句是我最近一直在做的事情。# 什麼是switch語句?
  • Linux C語言: switch語句的範圍判斷!
    在C語言中,除了循環結構,還有的就是分支結構,分支結構中有if分支與switch分支,一般地,需要判斷的條件情況少時,就使用if分支;當判斷的情況複雜時
  • switch 語句
    1. switch 語句形式switch 語句的一般形式:switch(表達式) {case