0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Switch case中的case順序

麥辣雞腿堡 ? 來源:軒哥談芯 ? 作者:Debug ? 2023-11-20 18:16 ? 次閱讀

Switch case中的case順序

Switch 可能轉化成多種不同算法的代碼。其中最常見的是跳轉表和比較鏈/樹。當switch用比較鏈的方式轉化時,編譯器會產生if-else-if的嵌套代碼,并按照順序進行比較,匹配時就跳轉到滿足條件的語句執(zhí)行。所以,可以對case的值依照發(fā)生的可能性進行排序,把最有可能的放在第一位,這樣可以提高性能。

此外,在case中推薦使用小的連續(xù)的整數(shù),因為在這種情況下,所有的編譯器都可以把switch 轉化成跳轉表。

不好的代碼:

int days_in_month, short_months, normal_months, long_months;
......
switch (days_in_month)
{
case 28:
case 29:
short_months ++;
breakcase 30:
normal_months ++;
break;
case 31:
long_months ++;
break;
default:
cout < < "month has fewer than 28 or more than 31 days" < < endl;
    break;
}

推薦的代碼:

int days_in_month, short_months, normal_months, long_months;
......
switch (days_in_month)
{
case 31:
long_months ++;
breakcase 30:
normal_months ++;
breakcase 28:
case 29:
short_months ++;
break;
default:
cout < < "month has fewer than 28 or more than 31 days" < < endl;
    break;
}

提升循環(huán)的性能

要提升循環(huán)的性能,減少多余的常量計算非常有用(比如,不隨循環(huán)變化的計算)。

不好的代碼(在for()中包含不變的if()):

for( i ...)
{
if( CONSTANT0 )
{
  DoWork0( i );// 假設這里不改變CONSTANT0的值
}
else
{
DoWork1( i );// 假設這里不改變CONSTANT0的值
}
}

推薦的代碼:

if( CONSTANT0 )
{
for( i 。。。)
{
DoWork0( i );
}
}
else
{
for( i 。。。)
{
DoWork1( i );
}
}

如果已經知道if()的值,這樣可以避免重復計算。雖然不好的代碼中的分支可以簡單地預測,但是由于推薦的代碼在進入循環(huán)前分支已經確定,就可以減少對分支預測的依賴。

選擇好的無限循環(huán)寫法

編程中,我們常常需要用到無限循環(huán),常用的兩種方法是while (1)for (;;)。這兩種方法效果完全一樣,但哪一種更好呢?讓我們看看它們編譯后的代碼。

編譯前:

while (1);

編譯后:

mov eax,1
test eax,eax
je foo+23h
jmp foo+18h

編譯前:

for (;;);

編譯后:

jmp foo+23h

顯然,for (;;)指令少,不占用寄存器,而且沒有判斷、跳轉,比while (1)好。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Switch
    +關注

    關注

    1

    文章

    532

    瀏覽量

    58111
  • C語言
    +關注

    關注

    180

    文章

    7594

    瀏覽量

    135858
  • 程序
    +關注

    關注

    116

    文章

    3756

    瀏覽量

    80751
  • 代碼
    +關注

    關注

    30

    文章

    4722

    瀏覽量

    68231
收藏 人收藏

    評論

    相關推薦

    LabVIEWcase結構問題

    請問,在LabVIEW怎么樣數(shù)據(jù)在連個CASE結構傳遞,還有就是怎樣將數(shù)據(jù)從同一CASE的true傳遞到FALSE
    發(fā)表于 11-09 00:12

    (急求)LabVIEWCASE問題

    請問,在LabVIEW怎么樣數(shù)據(jù)在連個CASE結構傳遞,還有就是怎樣將數(shù)據(jù)從同一CASE的true傳遞到FALSE
    發(fā)表于 11-09 00:29

    關于case順序問題,請小伙伴們指點指點

    switch case 要不要一定按順序放比如case 1:case 2:
    發(fā)表于 07-15 16:02

    C語言switch case怎么執(zhí)行

    switch(temp){case a: for(i=0;i
    發(fā)表于 03-22 07:27

    高效的C編程之Switch語句

    14.6 Switch語句 編譯器通常將C語言中的Switch語句編譯一個查找表(Table Lookup)以便跳轉到合適的入口處。 下面的例子顯示了編譯器如何處理程序Switch
    發(fā)表于 10-17 16:55 ?4次下載

    C語言的switch case多分支選擇語句的詳細資料說明

    1、switch-case開關語句是一種多分支選擇語句,用來實現(xiàn)多方向條件分支。雖然采用if-else條件判斷語句也可以實現(xiàn)多方向條件分支,但是當分支較多時,使用if-else條件語句的嵌套層次會
    發(fā)表于 07-12 17:39 ?1次下載
    C語言的<b class='flag-5'>switch</b> <b class='flag-5'>case</b>多分支選擇語句的詳細資料說明

    C語言switchcase標簽簡析

    最近在看一些開源的東西,發(fā)現(xiàn)switchcase標識僅僅只是一個標簽,跟使用goto語句所定義的label標簽是類似的。
    發(fā)表于 08-05 17:43 ?1432次閱讀
    C語言<b class='flag-5'>switch</b><b class='flag-5'>中</b>的<b class='flag-5'>case</b>標簽簡析

    Verilog的If語句和case語句介紹

    。這些語句統(tǒng)稱為順序語句。case 語句和 if 語句都是 verilog 順序語句的示例。在這篇文章的其余部分,我們將討論如何在verilog中使用這兩個語句。然后,我們考慮這兩個
    的頭像 發(fā)表于 05-11 15:37 ?4223次閱讀
    Verilog<b class='flag-5'>中</b>的If語句和<b class='flag-5'>case</b>語句介紹

    CASE:創(chuàng)建多路分支

    CASE:創(chuàng)建多路分支 說明 使用“創(chuàng)建多路分支”指令,可以根據(jù)表達式的值執(zhí)行多個指令序列的一個。 表達式的值必須為整數(shù)或位字符串。執(zhí)行 CASE 指令時,會將表達式(變量)的值與多個常數(shù)的值進行
    的頭像 發(fā)表于 06-27 11:46 ?776次閱讀
    <b class='flag-5'>CASE</b>:創(chuàng)建多路分支

    case后邊可以跟多個語句嗎

    是的,"case" 后面可以跟多個語句。在編程語言中,"case" 通常被用于 switch 語句中,用于檢查一個變量或表達式是否匹配某個特定的值。當匹配成功時,可以執(zhí)行一個或多個語句。 下面是一個
    的頭像 發(fā)表于 11-30 14:19 ?6122次閱讀

    java switch case的語法規(guī)則

    在Java,switch case語句是一種用于多分支選擇的控制流語句。它允許根據(jù)某個表達式的值來執(zhí)行不同的代碼塊。下面是關于switch cas
    的頭像 發(fā)表于 11-30 14:40 ?2075次閱讀

    java switch case值能為枚舉值嗎

    Javaswitch語句可以接受枚舉類型的值作為參數(shù)。在Java,枚舉是一種特殊的數(shù)據(jù)類型,它定義了一個固定數(shù)量的命名常量。因此,可以將枚舉值作為switch語句的
    的頭像 發(fā)表于 11-30 14:41 ?4916次閱讀

    java switch case 能不能用字符串

    fruit = "apple" ; switch (fruit) { case "apple" :System.out.println( "This is an apple." ); break ; case "orange"
    的頭像 發(fā)表于 11-30 14:46 ?1912次閱讀

    javaswitch語句 case的取值

    Javaswitch語句是一種用于多重條件判斷的語句,用于根據(jù)不同的條件執(zhí)行不同的代碼塊。在switch語句中,case關鍵字用來指定不同的取值。 在Java
    的頭像 發(fā)表于 11-30 16:05 ?1028次閱讀

    oracle case when 語法介紹

    Oracle的CASE WHEN語法是一種在數(shù)據(jù)庫查詢中使用的條件語句,它提供了一種在SELECT語句中根據(jù)條件對結果進行轉換或篩選的方法。在本文中,我們將詳細介紹Oracle的CASE WHEN
    的頭像 發(fā)表于 12-06 10:21 ?1650次閱讀