那曲檬骨新材料有限公司

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

完善資料讓更多小伙伴認識你,還能領(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)化時,編譯器會產(chǎn)生if-else-if的嵌套代碼,并按照順序進行比較,匹配時就跳轉(zhuǎn)到滿足條件的語句執(zhí)行。所以,可以對case的值依照發(fā)生的可能性進行排序,把最有可能的放在第一位,這樣可以提高性能。

此外,在case中推薦使用小的連續(xù)的整數(shù),因為在這種情況下,所有的編譯器都可以把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 ++;
break;
case 30:
normal_months ++;
break;
case 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 );// 假設(shè)這里不改變CONSTANT0的值
}
else
{
DoWork1( i );// 假設(shè)這里不改變CONSTANT0的值
}
}

推薦的代碼:

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

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

選擇好的無限循環(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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Switch
    +關(guān)注

    關(guān)注

    1

    文章

    533

    瀏覽量

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

    關(guān)注

    180

    文章

    7614

    瀏覽量

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

    關(guān)注

    117

    文章

    3795

    瀏覽量

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

    關(guān)注

    30

    文章

    4827

    瀏覽量

    69054
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    (急求)LabVIEWCASE問題

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

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

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

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

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

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

    Verilog的If語句和case語句介紹

    。這些語句統(tǒng)稱為順序語句。case 語句和 if 語句都是 verilog 順序語句的示例。在這篇文章的其余部分,我們將討論如何在verilog中使用這兩個語句。然后,我們考慮這兩個
    的頭像 發(fā)表于 05-11 15:37 ?4749次閱讀
    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 ?946次閱讀
    <b class='flag-5'>CASE</b>:創(chuàng)建多路分支

    case后邊可以跟多個語句嗎

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

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

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

    java switch case值能為枚舉值嗎

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

    java switch case 能不能用字符串

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

    javaswitch語句 case的取值

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

    oracle case when 語法介紹

    Oracle的CASE WHEN語法是一種在數(shù)據(jù)庫查詢中使用的條件語句,它提供了一種在SELECT語句中根據(jù)條件對結(jié)果進行轉(zhuǎn)換或篩選的方法。在本文中,我們將詳細介紹Oracle的CASE WHEN
    的頭像 發(fā)表于 12-06 10:21 ?1931次閱讀
    娱乐城免费送彩金| 博彩公司排名| 至尊百家乐20130301| 累积式百家乐官网的玩法技巧和规则 | 百家乐官网赌场破解方法| 百家乐官网视频软件| 德州扑克胜率计算器| 免费百家乐倍投工具| 百家乐官网专业赌博| 鲨鱼百家乐官网游戏平台| 网络赌博游戏| 大发888游戏登陆| 澳门百家乐赌场| A8百家乐娱乐网| 百家乐游戏如何玩| 哪家百家乐官网优惠最好且信誉不错| 足球.百家乐官网投注网出租| 百家乐官网群东方鸿运| 百家乐正品| 大发888 打法888 大发官网| 百家乐首选| 百家乐娱乐城官方网| 百家乐官网真人游戏| 旧金山百家乐官网的玩法技巧和规则| 百家乐官网赌场娱乐| 百家乐官网必胜法hk | 六合彩报| 大发888手机版下载安装| 全讯网365| 百家乐翻天电影| 百家乐五子棋| 澳门百家乐赢钱技术| 属羊的和属猪的做生意| 伯爵百家乐官网的玩法技巧和规则| 大世界百家乐官网娱乐网| 百家乐官网西园出售| 澳门百家乐官网哪家信誉最好| 百家乐官网筹码防伪定制| 百家乐官网庄闲的概率| TT百家乐官网现金网| 金宝网|