標題: 請教一個C語言switch語句的問題 [打印本頁]

作者: dzbj    時間: 2022-2-19 22:58
標題: 請教一個C語言switch語句的問題
標準程序

case 1:
a=1;
b=0;
c=10
break;

case 2:
a=0;
b=1;
c=10;
break;

可見c=10是相同的 問題是 如何把相同的行只寫一次 以前看過一位高人寫過可我給忘了 而且 找不到那帖子了

我合并了一下是下面這樣 結果都不對 也許就不行吧 可有點不死心啊 求高人給鑒定

case 1:
a=1;
b=0;

case 2:
a=0;
b=1;
c=10;

break;

作者: TEC    時間: 2022-2-19 23:17
break不能少,c=10要不寫在swtich外面,要不也不要少。
作者: dzbj    時間: 2022-2-19 23:31
TEC 發(fā)表于 2022-2-19 23:17
break不能少,c=10要不寫在swtich外面,要不也不要少。

感謝回復先 你說的對 老老實實寫就沒問題 我是好奇switch語句有沒有更牛的寫法

假如是if語句 可以嵌套 那么一層里把需要歸并的寫前面就行 但switch語句里假如只有1和2允許修改c值的情況下 寫前面會有問題吧
作者: 188610329    時間: 2022-2-19 23:41
dzbj 發(fā)表于 2022-2-19 23:31
感謝回復先 你說的對 老老實實寫就沒問題 我是好奇switch語句有沒有更牛的寫法

假如是if語句 可以嵌套 ...

可以用 goto 但是,不合算,C=10;   要比goto 高效的多。
作者: Hephaestus    時間: 2022-2-20 01:51
你的寫法確實節(jié)約了程序的長度,但是運行時間反而變長了。貼出完整的switch代碼,看看能優(yōu)化到什么程度,你現(xiàn)在貼出來的代碼如果是全部的話,在switch前面給c賦值就是最優(yōu)解。
作者: xhaity    時間: 2022-2-20 09:20
不清楚您的完整邏輯,表面看把c寫在switch外面就可以,但仔細分析,從邏輯來看case 3的例外情況呢,所以沒有優(yōu)化的必要。
作者: dzbj    時間: 2022-2-20 13:43
188610329 發(fā)表于 2022-2-19 23:41
可以用 goto 但是,不合算,C=10;   要比goto 高效的多。

感謝回復 從過去的交流得到經驗 你在效率方面的評論毋庸置疑
作者: dzbj    時間: 2022-2-20 13:53
Hephaestus 發(fā)表于 2022-2-20 01:51
你的寫法確實節(jié)約了程序的長度,但是運行時間反而變長了。貼出完整的switch代碼,看看能優(yōu)化到什么程度,你 ...

感謝回復

這個問題本來沒有啥完成函數 只是寫程序半路突然冒出個想法 在沒有完整思路的時候 你這也確實是最好的建議
作者: dzbj    時間: 2022-2-20 13:56
xhaity 發(fā)表于 2022-2-20 09:20
不清楚您的完整邏輯,表面看把c寫在switch外面就可以,但仔細分析,從邏輯來看case 3的例外情況呢,所以沒 ...

感謝回復

目前看來 各位大佬的建議都是沒必要
作者: 188610329    時間: 2022-2-20 19:09
dzbj 發(fā)表于 2022-2-20 13:43
感謝回復 從過去的交流得到經驗 你在效率方面的評論毋庸置疑

keil c,在Switch的優(yōu)化方面是做的比較好的,我曾經為了合并同類項,有過在Switch里面加goto這種很不c的做法,后來發(fā)現(xiàn)完全畫蛇添足。你也是實干派,你可以做個實驗,現(xiàn)在這個例子相同的只有一句,你如果想同的有3句以上,不管是內容還是排列順序都一樣的話,在編譯時keil 會自動把他們合并,假定case 1和2有5句相同,2和3有4句相同,keil也會弄出一個最優(yōu)合并方案,這個你簡單寫一下,編譯后看一下編譯后代碼即可,雖然是匯編,但是簡單的跳轉應該不影響你閱讀。當然有個前提,就是這里說的相同項,必須是從break開始往上倒數,完全一致的相同項,包括順序。
作者: dzbj    時間: 2022-2-20 20:51
188610329 發(fā)表于 2022-2-20 19:09
keil c,在Switch的優(yōu)化方面是做的比較好的,我曾經為了合并同類項,有過在Switch里面加goto這種很不c的 ...

謝謝

一直對keil的優(yōu)化摸不著頭腦 優(yōu)化等級里有一個就是重復語句盡量用一個 但使用中效果一般 你這么一提醒是個很好的啟發(fā) 而且道理上講得通 “當然有個前提,就是這里說的相同項,必須是從break開始往上倒數,完全一致的相同項,包括順序�!� 這句我覺得挺重點的
作者: wojiaoguogai    時間: 2022-2-21 09:16
錯了,這樣最終結果當case1時,a=1,b=0,c=10      沒啥特殊的技巧,老老實實寫吧,可以定義個函數,這樣修改C的時候,就不用哪兒都修改
作者: dzbj    時間: 2022-2-21 09:43
wojiaoguogai 發(fā)表于 2022-2-21 09:16
錯了,這樣最終結果當case1時,a=1,b=0,c=10      沒啥特殊的技巧,老老實實寫吧,可以定義個函數,這樣 ...

感謝回復 明白
作者: frank_tw    時間: 2022-2-21 14:59
switch (x)
{
c=10;
case 1:
           a=1;
           b=0;
break;

case 2:
        a=0;
        b=1;
break;
}
作者: dzbj    時間: 2022-2-21 18:31
frank_tw 發(fā)表于 2022-2-21 14:59
switch (x)
{
c=10;

感謝你的回復

是我描述問題不夠全面 有誤導嫌疑 我想請教的是當不同分支里有相同指令又有不同指令時 能不能合并和怎么合并分支 因為我自己沒想出來

你提供的回答是正確的 但有時候不能這么用 因為假如case1需要c=10 case2需要C=10 但case3分支里不允許修改c值時 這么寫等于在case3時也把c變量改了

目前得到的大部分意見都是按規(guī)矩寫
作者: mimidog111    時間: 2022-2-23 10:35
break;執(zhí)行完要跳出的




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1