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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Switch case中的case順序

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

Switch case中的case順序

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

此外,在case中推薦使用小的連續(xù)的整數(shù),因?yàn)樵谶@種情況下,所有的編譯器都可以把switch 轉(zhuǎn)化成跳轉(zhuǎn)表。

不好的代碼:

int days_in_month, short_months, normal_months, long_months;
......
switch (days_in_month)
{
case 28:
case 29:
short_months ++;
break;
case 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 ++;
breakdefault:
cout < < "month has fewer than 28 or more than 31 days" < < endl;
    break;
}

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

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

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

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

推薦的代碼:

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

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

選擇好的無限循環(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 (;;)指令少,不占用寄存器,而且沒有判斷、跳轉(zhuǎn),比while (1)好。

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

    關(guān)注

    1

    文章

    533

    瀏覽量

    58264
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7605

    瀏覽量

    136934
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3787

    瀏覽量

    81074
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4790

    瀏覽量

    68654
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    LabVIEWcase結(jié)構(gòu)問題

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

    (急求)LabVIEWCASE問題

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

    關(guān)于case順序問題,請(qǐng)小伙伴們指點(diǎn)指點(diǎn)

    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語句編譯一個(gè)查找表(Table Lookup)以便跳轉(zhuǎn)到合適的入口處。 下面的例子顯示了編譯器如何處理程序Switch
    發(fā)表于 10-17 16:55 ?4次下載

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

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

    C語言switchcase標(biāo)簽簡(jiǎn)析

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

    Verilog的If語句和case語句介紹

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

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

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

    case后邊可以跟多個(gè)語句嗎

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

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

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

    java switch case值能為枚舉值嗎

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

    java switch case 能不能用字符串

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

    javaswitch語句 case的取值

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

    oracle case when 語法介紹

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