阿耀 發問時間: 電腦與網際網路程式設計 · 10 年前

關於C的switch case用字串判斷

請問C中的SWITCH CASE如何可以判斷整串字串,可以舉個簡單的例子嗎?

3 個解答

評分
  • 其威
    Lv 7
    10 年前
    最佳解答

    沒有辦法.

    switch case 只能判斷 PoD (Plain old Data) type, 不能是 array, 也不能是 C++ class.

    舉例, 你可以寫

    int a = 10;

    switch (a) {

    case 123:

    ...

    case 456:

    ...

    }

    不能寫:

    char a['999'] = "xxx";

    switch (a) {

    case "yyy":

    ....

    case "zzz":

    ....

    }

    也不能寫 (以下為 C++):

    struct (或 class) AAA {

    ...

    bool operator == (struct AAA & rhs);

    };

    ...

    AAA a;

    switch (a) {

    case ???:

    ...

    case ???:

    ...

    }

    如果你要用 strcmp() 比較字串, 只能用一整串 if-else if-else.

    2011-02-08 04:50:14 補充:

    手誤, 請改成 char a[999] = "xxx";

    2011-02-08 04:51:12 補充:

    所謂 "一整串 if-else if-else" 是指:

    if (strcmp(a, "xxx") == 0) {

    ...

    }

    else if (strcmp(a, "yyy") == 0) {

    ...

    }

    else {

    ...

    }

    2011-02-09 06:39:39 補充:

    "自己寫一個 function" 的意思是說:

    enum MY_STRCMP {

    STRCMP_XXX,

    STRCMP_YYY,

    STRCMP_ZZZ,

    };

    MY_STRCMP my_strcmp(char *str1)

    {

    if (strcmp(str1, "xxx") == 0)

    return STRCMP;

    /// yyy zzz 打不下

    }

    然後

    switch (my_strcmp(a)) {

    case STRCMP_XXX:

    ...

    case STRCMP_YYY:

    ...

    case STRCMP_ZZZ:

    ...

    }

    這樣?

    2011-02-10 13:29:35 補充:

    唉, 問題就是沒辦法享受到 switch 的 O(1), 會變成 O(n).

    2011-02-10 23:58:32 補充:

    不知道有沒有更好的辦法...

    我能想到的只有透過 profiling 讓 compiler 調整 code path, 或是用 likely/unlikely (gcc extension) 給他 hint.

    2011-02-11 13:00:16 補充:

    首先, "Premature optimization is the root of all evil".

    所以, 如果在 profiling 以後發現這段 switch-case (或是類似 switch-case 的 code) 真的是瓶頸, 那麼應該想辦法從 O(n) 的 for-loop check 或是 if-else if-else 改成 O(log n) 的 binary search.

    2011-02-11 19:23:58 補充:

    如果是 switch case, 那麼要比較的東西一定得是事先可知的.

    你不能寫出以下這種 code:

    int a, b, c, d;

    switch (a) {

    case b: break;

    case c: break;

    case d: break;

    }

    b c d 一定得是 literal const.

    2011-02-11 19:27:21 補充:

    我並沒有說您的 code 是 premature, 您多慮了.

    我想表達的意思是, 一般狀況來說當然是寫容易維護的 code.

    如果這段 code 在整個程式的執行週期之中只佔很小的一部份 (例如 0.1 的時機才會執行到), 那麼應該用容易維護的 code.

    例如:

    const char **strs = { "xxx", "yyy", "zzz" };

    for (i = 0; i < 3; ++i)

    if (strcmp(a, strs[i]) == 0)

    return i;

    2011-02-11 19:28:33 補充:

    可是如果這段 code 常常被呼叫到, 導致以上的 O(n) code 變成程式的效能瓶頸, 那麼就該考慮將 strs 排序, 然後使用 binary search.

    當然, 這是在沒有辦法使用 O(1) 的 switch-case 的前提之下.

    2011-02-11 19:33:34 補充:

    所謂 "premature optimization" 的意思是, 在實際使用 profiling 等技術確認某段 code 是效能瓶頸之前, 就嘗試以維護性差, 但是又不會讓效能提昇很多的程式碼取代之.

    2011-02-11 23:40:02 補充:

    噢, Jacob 你又誤會了.

    首先, switch-case 如果設計的好是 O(1), 但是只能用在 PoD, 而且必須是確定的值.

    用 for-loop 做 sequeitial search 是 O(n).

    如果要 check 的東西很多 (例如幾十個), 而又常常會檢查到接近 n 個, 那麼改成 binary search (O(log n)) 比較理想.

    不過在改之前, 應該先確認這段 code 的確是效能瓶頸.

    2011-02-11 23:48:26 補充:

    當要比較的字串成千上百, 而且以後還有可能增加或減少的時候, 也許真的應該考慮 binary search, 而不是 seq search.

    2011-02-12 16:11:03 補充:

    switch-case 的限制是寫在 c 跟 c++ 規格書裡的.

    原提問者是問

    char *a;

    switch (a) {

    case "xxx":

    }

    這種 code 通不過編譯, 有沒有解決辦法.

    我說 "沒辦法, 必須用 if-else".

    因為我也寫出過以上的 code 然後通不過編譯... 後來改成 if-else, 不過我的 case 不多 (4 or 5 個吧), 沒考慮其他作法.

    2011-02-12 16:14:03 補充:

    你說 "用 for-loop 去 check", 我也想到大概是怎麼做, 只是提出 "那是 seq search, 複雜度是 O(n)"

    並表示 "switch-case 設計優良時是 O(1), 如果要用 search 應使用其他 O(log n) 的演算法"

    本來寫程式就是要變通. 用來繞過 switch-case 的限制的辦法本來就有很多, 我提出一種最基本的, 我不懂這跟自曝其短又有什麼關係?

    2011-02-12 16:23:23 補充:

    另外, 我也提出 "是否要用其他辦法加速程式, 要依照 profiling 後的結果而定, 因為 premature optimization is the root of all evil (不成熟的最佳化是萬惡的根源)."

    說出 "這裡有很多牛人" 這件事也很奇怪, switch-case 的 case X 只能是 literal const 這件事情, 再牛的人來也不能改變吧? 除非牛到可以進 c/c++ 委員會去改規格...

    2011-02-13 15:02:52 補充:

    哎呀, 你離題了. 答案應該是 "C 本身沒有繪圖功能, 要引用外部函式庫."

    我一直在提:

    1. switch-case 做的好是 O(1), 可是他只能 check PoD, case X 必須是 literal const

    2. if-else if-else 是 O(n) (他每個 if 都得去 check)

    3. for loop 配合 if 是 O(n) (每個 case 都得去 check)

    4. 如果確定這段 code 是瓶頸, 應該使用其他 O(log n) 的搜尋演算法

    5. 在改用 O(log n) 作法之前, 應該先用 profiling 等手法確認他是瓶頸

    2011-02-13 15:09:59 補充:

    你提出的方法是用 3 轉成可以配合 switch-case 的形式, 我提出他是 O(n), 並提出 4 與 5.

    不是在指不應該這麼作, 而是提一個 note, 表示在某些狀況下應考慮其他作法.

    說真的, 我還真搞不懂哪裡有失誤?

    我想你一定誤會了那段英文的意思, 也沒有說你的方法 premature.

    我說的是 "違反 5 就直接改 code 是 premature optimization."

    2011-02-13 21:38:28 補充:

    switch-case 的 case 會在執行階段變多變少!? 我還是第一次知道...

    可以在 case X 的 X 部分放變數!? 這我也是第一次知道...

    switch (a) 的 a 是變數, 會改變. 但是底下的一堆 case X 是不可變的. 何來 "資料雙向會變" 這種狀況?

    要比較的東西在編譯期就必須確定, 為什麼不能排序好再使用 O(log n) 的 binary search?

    2011-02-13 21:54:10 補充:

    我沒有在這個問題之中找藉口掩飾任何東西, 也不覺得我的回答與意見有問題.

    至於認不認真, 在某篇印系統時間的問題之後, 我自認就沒有再不認真回答問題過.

    都是先嘗試敘述我對問題的理解, 然後給出一個解.

    當然我對問題本身的理解可能有誤, 若有人提出我也會接受或補充回答.

    另外, 根據你在意見 014 與 025 的發言, 表示你不了解什麼是 premature optimization.

    麻煩你去 google 一下再回來把我的意見重看一次, 否則你一直在誤會我的意思.

    2011-02-15 00:20:31 補充:

    噢抱歉, 意見 011 之中我想表達的是 "應該在確認某段 code 是效能瓶頸以後, 再著手進行最佳化, 否則是一種 premature optimization." 並沒有針對其他意見評論的意思.

    如果因為我的用詞造成你理解錯誤, 那麼我必須告訴你那是個誤會.

    我也沒有說你英文不好, 只是從你之後的意見中, 發現你對 "premature optimization" 的理解跟我的理解不同.

    而我認為我的理解跟 google 上能找到的解釋比較接近, 所以建議你再多了解.

    2011-02-15 00:27:03 補充:

    另外, 我對 "兩邊資料會變" 的理解是,

    char *a = "x";

    switch (a) {

    case "a":

    case "b":

    }

    之中:

    1. a 會改變

    2. case 的會增加或減少 (例如移去 case "a", 加入 case "c")

    3. 宣告 char *b = "y", 然後寫 case b:

    而 c 不允許 2 跟 3.

    如果我的理解有誤, 可否請你補充?

    2011-02-15 00:34:35 補充:

    前篇 "c 不允許 2 跟 3" 指的是

    - 在執行期不允許 2 (除非用某些奇計淫巧, 可是這超出討論範圍)

    - 在編譯期不允許 3 (syntax error)

    並且, 若用 char * 作為 switch-case 的 case, 會有跟原提問者所想得意思完全不同的行為. (原提問者的問題).

    不知我在本篇回答 (原始回答, 非意見) 之中, 哪裡有錯?

    2011-02-15 00:49:33 補充:

    另外, 我會覺得你對 premature optimization 理解有誤的原因還有一項.

    那就是你誤會我說你使用 function 包 for-loop 來配合 switch-case 的方法是 prem. opt.

    如果你光是看過 wikipedia 上 program optimization 底下關於 prem. opt. 的部份, 就應該能理解你的技巧著重 design 的部份, 跟 opt. 沒有關係.

    而我提出的 "修改" 在用的不好的狀況下會變成 prem. opt., 所以才特別指出.

    2011-02-16 08:42:49 補充:

    你在意見 1 提到可以用個 function 包起來, 我沒想到裡面是 for-loop, 所以才有意見 2 的疑問.

    你在意見 3 提出 for-loop, 我 note 他的 O, 並指出若有效能瓶頸可用 binary search 加速.

    然後你就提出了 "兩邊都會變" 以及 nested switch-case 兩種狀況.

    2011-02-16 08:48:54 補充:

    在你提到你曾經修過很多 compiler 與 optimization 的課以前, 我當然不知道你到底懂什麼不懂什麼.

    可是你提到的東西是 design 的部分 (把 switch-case 換成 for-loop + if), 跟 opt. (switch-case vs. seq search vs. binary search) 完全沒有關係.

    然而你卻誤以為我在說你這個與 opt. 完全無關的東西是 prem. opt., 所以我開始懷疑你與我之間對於 prem. opt. 的理解不同.

    2011-02-16 08:49:15 補充:

    意見 11 是 "首先 ... 所以 ..." 的形式, 第一句是後面整段的原因, 沒有要評論其他意見.

    是你把它拆開來, 以為前句是在評論你的文章, 後面才是新的意見.

    你自己把 context bind 到錯誤的地方, 然後怪我不夠 sensitive?

    如果我要說你的方法怎樣怎樣, 會直接說 "你的方法 xxx", 因為沒有主詞很容易搞混.

    例如, 這裡你就搞混了... 也許我應該把第二句提前?

    2011-02-16 08:52:22 補充:

    另外, 我還是不太能理解你的 "case_1 會變" 是什麼意思.

    例如:

    switch (brand) {

    case NVIDIA: ...

    case ATI: ...

    case INTEL: ...

    }

    你能把他變一下讓我理解嗎?

    2011-02-16 20:12:10 補充:

    我的確認為自己有一定程度, 但是並沒有攻擊他人的回答.

    我如果有回答別人答過的問題, 都是因為我覺得答案

    1. 不夠充分, 作為補充 (補充少的在意見, 補充多的新開回答)

    2. 有誤

    我不能保證每次的回答都絕對最好最對 (沒有人可以保證), 若有人提出明顯更好的辦法, 我當然也接受.

    2011-02-16 20:34:00 補充:

    意 1 中, 你只提出概念, 沒提供作法. 所以我不知道你說的 function 要包什麼東西進去, 就以為你想包 if-else (context-sensitive 嘛).

    後 3 提到 for-loop, 我才知道你的 function 要包什麼, 才會有 5 的 performance note.

    8 你給出一個問題, 9 我提出想到的解.

    10 你補充 "維護性很重要", 11 我補充 "在何時應該考慮 optimization".

    我覺得你預設立場, 認為我在攻擊你, 事實上我只是在提出問題與補充而已.

    我也重看了好幾遍, 實在不覺得有攻擊的文字在內.

    2011-02-16 20:51:25 補充:

    而且我不大清楚, 在之前的回答中, 怎樣擺出了 "高手姿態".

    我不認為我有表達 "我很厲害, 你們都比我爛, 所以我寫出的 code 超棒, 所有人的 code 在我眼中都一文不值" 的 idea.

    大部份我在提出其他作法的時候, 都是用 "這樣做可能比較好" 這般形式.

    還是你認為只要有人提出跟你做法不同的, 都是擺高手姿態?

    2011-02-16 20:58:59 補充:

    回到問題, 053 中提出的做法, 適用狀況有限.

    假設今天在 parse XML (才會有一堆字串比較嘛~), 不同的 tag 之間即使相同的 attribute 也可能有不同的操作. 這時候就不適用.

    例如, script 的 src 要引入該 src 並 eval, 但是 img 的 src 是要取得圖片來顯示.

    此時就沒辦法用 function 包起來變成單層的 switch-case (即使有, 也會變得很不直觀, 導致維護性下降).

    2011-02-16 21:03:29 補充:

    再, 原題目也沒有提到 nested 的狀況.

    2011-02-16 21:10:34 補充:

    你提到 qid=1511021507063, 我的回答是以 ANSI C 標準為主.

    也不認為你的意見 2 是在攻擊我 (而是補充說明). 針對你的補充, 我去找了一些資料寫在 3.

    還是你覺得意見 3 是在攻擊你意見 2? 如果是, 你可能要思考一下自己是否有預設立場.

    2011-02-18 01:12:08 補充:

    long float 那題, 該資料型態是在我學 c 以前的東西, 在你提之前我還真不知道有.

    後來你提到有某些編譯器支援, 我去查了資料, 才發現原來他是 pre-ANSI 的東西, 現在的編譯器幾乎不吃.

    我覺得以 ANSI C 為主來回答問題並沒有什麼問題, pre-ANSI C 甚至 K&R C 都已經是很古早的東西, 沒理由以這些標準來回答問題.

    就如同在 c++ 中我會鼓勵大家引用 iostream 而非 iostream.h.

    2011-02-18 01:20:28 補充:

    "沒聽過 long float" 並不是我回的, 雖然我之前的確不知道這東西.

    你當然可以補充說 "以前的 c 有, 但是新的標準已經取消", 我認為該題的討論是很良好的互動, 能讓人學到東西.

    2011-02-18 01:27:51 補充:

    在此題中, 我猜測提問者想做的事情是在回答中 "不能寫:" 跟 "也不能寫:" 下面的事情.

    回答 "沒有辦法", 是想點出若這樣做, 可能會有跟原先預期不同的執行結果.

    並且也有給出一個用 if-else 的解法 (在第二次的補充回答).

    你當然可以認為回答不夠完整來補充, 只是光補充 "可以用 function 包起來" 是否也不夠完整呢?

    我不反對你來括我的鬍子, 只是你可能也該摸摸自己的下巴.

    2011-02-18 01:53:42 補充:

    我在這裡的回答與意見, 多半是針對問題而非提問/回答者.

    - 一個問題, 一個答案.

    - 一個答案, 一個 (或一些) 補充.

    我一直不覺得我有在惡意攻擊任何人或事.

    若有人覺得被我的回答或是補充 "攻擊" 到了, 是否該反省自己的回答或意見有什麼不足之處?

    2011-02-18 01:56:27 補充:

    例如我記的某次的 "該寫 if (x == 0) 還是 if (0 == x)", 我也是提出我的看法, 一些 performance analyze, 還有這個 trick 的適用與不適用狀況.

    反而是有人跳出來說我沒人性 XD~

    到底是誰在攻擊誰?

    2011-02-18 02:02:01 補充:

    ohh, 看來我也該向提問者道歉.

    原來 Jacob 不願意提供更好的作法, 是因為我的緣故.

    都是我導致 Jacob 不願意分享他超級好的 code, 都是我的不好.

    可是... 你分不分享 code, 關我什麼事呢? 我管得著嗎我?

    2011-02-18 06:38:38 補充:

    目前只有我們兩人在討論, 你提出 "有人說" "沒聽過 long float 這個喔", 那你覺得我會覺得你在說我還是說別人? (context sensitive)

    作為知識家 c/c++ 版的版友, 我覺得你不應該不理. 遇到錯誤 / 不足的回答, 本來就該補充.

    如我所說, 該題的意見是很好的互動.

    2011-02-18 07:07:48 補充:

    如果你回去看那串 "if (0 == x)" 的意見, 就會發現我一直嘗試就事論事.

    你提出你的看法+理由, 我提出我的看法+理由, 然後東邪提出他的看法+理由, 然後我發現東邪說得並不完全正確 (效能部份), 於是提出佐證 (兩個版本的 gcc + 三種不同 CFLAGS 的結果).

    然後, 接下來就只有一些主觀沒佐證的回覆, 然後變成在討論我是否可恥... = =

    2011-02-18 07:25:54 補充:

    我從來沒有說過類似 "你這答案有夠爛, 會回答出這種答案的人也很糟糕" 這種話.

    實際狀況正好相反, 都是別人對我說.

    有不否認常常有比我好的答案, 問題是要說我的回答爛, 至少也該舉個比較好的方法出來吧?

    例如我在提出你的 seq search 不是最好時, 也有提供理由, 並且也提到何時該改為 O 比較低的 bin search, 更沒有針對你的人格來討論.

    2011-02-18 07:47:03 補充:

    我接受他人說我的方法爛, 也歡迎就事論事的討論.

    但是因為我的方法爛, 就開始攻擊我的人格... 這... 實在搞不清楚誰比較糟糕?

    依照教育部國語辭典的解釋, "指責" 是 "責備、怪罪".

    我認為我總是針對方法或問題本身提出看法, 並沒有因為方法或回答有誤或不好, 而 "責備、怪罪" 答題者.

    也許你對 "指責" 的理解跟國語辭典不同? 是否能請你解釋該詞?

  • 10 年前

    這個好有趣!沒想到可以這樣寫!不過還沒實際測!

    2011-02-10 16:44:30 補充:

    實作了一下,還是不了解,對於enum和指標不熟!

    2011-02-10 16:45:24 補充:

    return STRCMP;這個地方也卡住了

  • 10 年前

    動手腳自已寫一個 function 後就可以。

    就程式架構、完整性、可讀性等而言,建議這麼做!

    2011-02-09 13:53:53 補充:

    弄個 trick,變成 for loop 去 check!

    2011-02-10 20:52:39 補充:

    不然呢?有啥更好的方法?

    難道吃要 general sort 都到 O(n)?

    2011-02-11 05:00:55 補充:

    我是對這東西沒什麼研究。

    不過,當有二層以上的 字串 要 switch case 時,

    會發現我在意見 001 說的,應該是對的!

    而,O(n)?在那時會是惡夢!

    程式設計,

     快很重要;

    但,

     意見 001 寫的東西經常更重要!

    數次將業界在賣的軟體加速上百、千、萬倍的人 留

    2011-02-11 14:46:50 補充:

    要是

     那些字串不是事前可知的

     字串本身有特殊原因,不能照順序

    如何 Binary Search?

    2011-02-11 14:53:14 補充:

    而,

    nested if else 效率絕對不會比 for loop 好!

    且在意見001的考量範圍,完全比不上!

    幾乎只贏在:〝剛開始〞coding的時候,省下一點時間!

    (之後的維護、修改,又輸回去!)

    那,為何不用?

    2011-02-11 15:02:05 補充:

    我會提到我的加速經歷,

    只是要說:我不是不愛速度,

    所以用 for-loop 降低 switch-case 的 O(n)。

    不過,你拿 Knuth 的東東來,

    好像,是在說你自己!

    我若是 能力/做法 premature,

    怎來動不動就萬倍加速的事情?

    2011-02-11 15:03:44 補充:

    修正錯字:

    用 for-loop 降低 switch-case 〝成〞 O(n)。

    2011-02-11 20:00:51 補充:

    沒 function 配合的 switch case 既然不能用在 string 上,

    還撐這些做什麼?

    還能 O(1)?

    我只是提出:

    用 function 把 nested if else 的

    程式架構、完整性、可讀性等

    提升!

    與 speed、O(?) time 何干?

    當遇到 string 多達數十上百時,

    還堅持要設法不用 function + switch case?

    一定要用 nested if else 來避免

     用 switch case 一定要用 O(1) 的快感

     要先 profiling 是不是 bottle neck

    = = = =

    2011-02-11 20:07:32 補充:

    而且,我也有講:

     for loop + switch case 法,只在一開始時的 coding 慢一點!

      將來都贏回來!

    (也就是說:除非

       確定字串只有 5個 7個!

       將來絕對不會再多!

     不然,就絕對不該用 nested if else!

    在那裡 profiling 的時間,早就浪費過頭了!

    別人直接用 for loop + switch case,早寫完十幾個東東了!

    你還在那裡 profiling + 將來不好維護!

    2011-02-11 20:07:40 補充:

    有興趣、不信邪的網友,大可以多試試 nested if else!

    我還可以再爆一招我見過更〝好〞的:

     用 do while 裡再再包 nested if else

    時間太多的網友可以慢慢享用!!

    到時被老闆開除,別怪我!

    = = = =

    我已經說得很明了:

     只要(將來可能)字串一多,就

      不該用 nested if else

      該用更好的方法!

       只是,我沒研究!只會用 function + switch case

    還要爭什麼 O(1) / premature optimization!

    我啥時提到 for loop / switch case 的速度問題了?

    2011-02-12 10:55:46 補充:

    弄個 function,絕對可以提昇各方面的東西(我提的)!

    至於能不能、該不該用 binary search 來

     提昇速度

     避免 premature optimization

     (都是帕拉提斯提的!)

    則是真的要看情況而定了!

    要比的字串(兩邊都)絕對是會變的!

    在這樣的情況下,一樣可以用 for loop + switch case!

    絕對沒有問題!

    = = = =

    2011-02-12 10:58:01 補充:

    我大可冷眼旁觀,看你留下真高手看了會笑的回答:

     〝沒有辦法〞

     提問者也沒得到幫助!

     以後查到這題的人也認為應該是這樣!

    你我 / 我和提問者 / 網友與我 之間, 也沒什麼仇,不值得我這樣做。

    所以我才在意見 001 提

     動手腳自已寫一個 function 後就可以。

     就程式架構、完整性、可讀性等而言,建議這麼做!

    只是你在意見二把它變成那麼醜的樣子!

    比你原來的 code 還難看!

    完全 不了解/無視於:

     『架構、完整性、可讀性』

    說的是什麼!

    你意見002寫的,哪裡增加了

     架構、完整性、可讀性(及你後來一直在鑽的O(1) / O(n log n))

    2011-02-12 10:58:13 補充:

    你會這樣回應,表示你

     真的認為:沒有辦法達到!

     意見002有達到!

    豈非笑話?

    = = = =

    帕拉提斯,我早已告訴過你:

     這裡程試設計

      年資超過25年以上的,我知道的,就至少有三人!

      碩士畢業十年以上的,我知道的,也有數人!

      博士以上的,我知道的,有不只三人!

       且有世界排名第35以前的資工博士班的!

        (台大沒排進前70!)

      IBM 程式師二人以上。

      台灣比賽第一名。

      台北比賽第一名。

    等怪咖。

    你沒見過各種變化,(後來)反而在提

     case X 的 X 只能是 literal const

    來否定我提的東西!

    只能說是自暴其短!

    2011-02-12 22:22:22 補充:

    問:C語言 switch case 可以畫圖嗎?

    答:不可以。它不是繪圖指令。

      若一定要寫,只能一步一步用一堆指令慢慢寫。

    意見 001:可用 OpenGL 或 DirectX。

    ...

    意見 028:switch-case 的限制是寫在 c 跟 c++ 規格書裡的,不能繪圖!

    原提問者是問

    Code 舉例

    我怎沒看到?

    = = = =

    我意見 026末 ~ 027頭 寫得很清楚:

     你根本惡搞別人的意見、善意!

     以為你的...

    2011-02-12 22:23:07 補充:

    我也再次提到:我在這題從沒提到 Optimization!

    有提的,只有你,而且一直在提!

    我提出的只有:

    1. 可以用 Function 讓 switch case 變成可以 check 字串。

    2. 這方法在 『架構、完整性、可讀性』的考量上,都不錯。

    只有你一直在提:Optimization,並暗指別人不該做這樣的意見!

    1. Premature optimization ...

    2. 要先 profiling

    3. 失去 O(1)

    4. X 是 literal const

    ...

    對這種不能、不願面對自己的失誤、還一直強辯的人,

    無言!

    我不願多浪費時間!

    你自己去鑽死胡同吧!

    2011-02-13 19:24:49 補充:

    就算硬要別人接受你現在的講法,

    資料既然雙向會變,就必須考慮能不能、該不該 Optimize!

    這仍再一次抵觸你說的東東!

    = = = =

    你一直在做這樣的事:

     用一堆藉口來掩蔽你的錯誤 與 不認真回答!

    連小學數學都答錯兩題,還用了另一位高手的意見來掩蔽你回答時的錯誤!

    還被別人指出!

    還要撐什麼?

    2011-02-14 21:48:22 補充:

    自從某一時(我沒很注意)後,你回答的認真性的確有明顯提昇。

    這絕對是事實。

    但我不覺得你回答的正確性,合於你的程度!

    以你回答的各題來看你的能力,

    你回答的正確性,應該能再高才對。

    而意見11最先出現的,不是 premature,而是〝首先〞!

    也就是說:那中英文的不在一起,顯示了你是故意加上那中文的!

    那,也就是說:該有〝再來〞!

    你如何解釋上述你對我的預備性攻擊?

    而且,你在那裡就提出 Optimization,卻是我一直沒提的東西!

    = = = =

    2011-02-14 21:48:31 補充:

    至於我英文好不好,你可以看看我

     不常回答、但有回答過的英文問題,

      及在回答過後,什麼知識團來邀我入團(我有加入)

     是否有用全英文回答過電腦問題?

     英文維基百科我編了幾條,有幾條被人指出文法有問題?

    就知道我懂不懂什麼是 premature optimization。

    = = = =

    我說:兩邊的資料都會變!

    我可沒說 X 會變!

    不要亂寫!

    2011-02-16 06:51:13 補充:

    case STRING_1:

    STRING_1 是 constant,

    但它不一定是 "string_1",它代表的是 case_1!

    而 case_1 是會變的!

    也就是說:當 case_1 變了的時後,

    STRING_1對應的,不是 "string_1",而可能是 "string_a"

    如:

    if (brand==NVIDIA)

    { switch case C1: ... }

    else if (brand==ATI)

    { switch case C1: ... }

    或其它更複雜的狀況。

    2011-02-16 06:51:58 補充:

    (這個例子多處不好!但可以表達。

     真的在做時,只是把 function裡的string pointer換掉就可以了!

     主程式裡根本沒有 if!

    = = = =

     修過 5門 的 Compiler。

     其中一門是專講 Optimization的。(這裡已有在這方面比我強的專家!)

     能常把業界賣的軟體加速上萬倍。

    你說我懂不懂 Prem opt?

    = = = =

    意1,我提出:可用的 design 法;

    意2,你接著:寫出比回答更差的;

    意3,我提出:可在 function 裡用 for-loop

    意5,你提出:O(1) O(n) O(n log n)

    (意4是發問者)

    2011-02-16 06:55:22 補充:

    意10,我提出:我常加速上萬倍(想指出:我不會不知 switch case 的 速度問題)

    意11,你提出:〝首先,〞prem opt

    (而我一直沒提Opt,只一提到我能加速。)

    該怎麼解讀?

    = = = =

    你既已在意40道歉,我接受!

    希望你以後在回答/意見/真實生活對話時,

    注意一下前後文 (Context sensitive!)!

    不然,這問題會不斷在你身邊繞著你!

    相信你能在某提後不再亂答,

    也能在這之後,好好處理 context 的問題。

    2011-02-16 19:35:03 補充:

    在 C/C++ 區回答的人,我都會看看。

    也因此會了解他大約能力與專長。

    你到這裡,應該沒有什麼在看別人的回答!

    才會不知我大概不是普通的高手。

    也因此,才會...

    意見048就是很好的說明!

    http://tw.knowledge.yahoo.com/question/question?qi...

    的回答,也是一小例。

    個人認為:

     你以為你很強了,才會數次攻擊這裡高手的回答!

    殊不知:這裡有不少怪物!

    我和這些怪物比,還差一截!

    我和這裡高手比快(及其它),還輸過數次!!

    比其它的,就更別說了。

    = = = =

    2011-02-16 19:35:22 補充:

    如:

    switch (brand)

    { case NVIDIA: switch (func) { case F1: ... }

    case ATI: switch (func) { case F1: }

    }

    可用〝一〞個 我說的

    c = func(xx); switch (c) { case F1: }

    就擺平,不用二個!

    (運氣不好,N_F1 可能要做 A_F2 / I_F3 的事!)

    而 兩邊會變,nested-switch 只是 一例/一種解決法。

    = = = =

    2011-02-16 19:57:45 補充:

    而 for-loop 只是 我用來說明:

     func 裡不是 nested-if!

     那不是解決問題的辦法!

     比你原來回答的還醜!

    難道你以為:

     這裡的人,只能把 nested if 從主程式搬去副程式!

    人外有人!天外有天!

    教我演算法的,是一位天才正教授!

    並且是退休的榮譽教授!同學稱他愛因斯坦(作風與髮型都有像)!

    他會的東西太多了!也出了演算法的課本。

    我修過他三門課,一門叫 NP complete and more

    他說:我還要開比這更難的課!

    天哪~!

    2011-02-16 19:58:20 補充:

    他是以coding出名的教授中,少數我從心裡〝完全〞佩服的!

    有一次,當我們目瞪口呆之際,他說:

     天下多的是人,可以寫出遠比我寫的快得多的程式!

    這...@.@

    一個好的程式師,要有這樣的認知與心胸!

    我寫的程式以快出名。

    意52已說:這裡不止兩人寫出過比我快的程式!

    我的指導教授很不屑地對我說;

     我手下隨便一個研究生寫的,都比你的快!

    = = = =

    2011-02-16 19:58:36 補充:

    你的回答,多次讓我(及這裡一些高手)覺得

     不好就算了,有些還具攻擊性!

    也因此,你的意見2, 5, 11,又接在 1, 3, 10 後!

    怎能讓人不覺得是在攻擊 1, 3, 10?

    攻擊我的,不一定會被我轟!

    回答錯誤百出,還有高手姿態的,才會被我轟。

    不是 所有/多數 的高手到這裡回答,都會被我轟!

    印象中,你是第三人!

    (不過,我可以確定:這裡C/C++比你強的,遠遠超過三人!

     哪天他們願意再回答,請你不要再...!

    2011-02-17 06:02:54 補充:

    關於你在意見062提到的那題:

    我不覺得那題你的意見在攻擊什麼。

    不過,

    C 不是只有 ANSI C!

    發問者也沒限制是哪一種 C

    〝沒聽過long float這個哦〞

    〝在 c 中, 浮點數的型態有...沒有 long float〞

    就像我以前不知一樣,long float 它的確存在!

    當我看到這樣的兩個回答,你要我怎麼辦?

     視而不見!讓發問者/回答者/以後的人都以為沒這東西!

    2011-02-17 06:03:03 補充:

    就像我曾寄私信給你一樣:

    當我覺得:

     這〝一〞人應該不差,留點面子。

    我就會寄私信,告訴回答者:

     其實是...

     該注意...

    (非一人的狀況,我比較懶,通常不會一個一個寄信。

     但意見中通常措辭會更注意。

    如果回答者(們)程度還很低,

    我就比較會直接在意見裡寫(說穿了還是懶!:p )。

    你攻擊他人的回答一事,的確存在!

    不然,不會有(至少)另二位 C/C++ 區的常客,

    也曾在數題的意見區裡和你唱反調!

    也就是說:你真的該想想你怎麼

     回答

     寫意見

    的,會引起至少三人出手反對你!

    2011-02-17 06:11:26 補充:

    回此題。

    談 if-else / for / while 能不談 nested?

    那,問 switch-case 不能/不該 談 nested?

    〝C中的SWITCH CASE如何可以判斷整串字串〞

    問:如何可以?

    意:〝動手腳自已寫一個 function 後就可以。

       就程式架構、完整性、可讀性等而言,建議這麼做! 〞

    哪不合適來著?

    問:如何可以?

    答:沒有辦法

    是否

     有欠完整

     不夠正確

    我必須說實話:

    對這題,

     我的確還有至少兩招更好的,不想在這裡寫!只因為:你在這裡回答!

    這我應該對其他網友、特別是發問者道歉。

    2011-02-18 05:12:39 補充:

    意 063〝沒聽過long float這個哦〞...

    代表的是:不只一人說沒有!

    而不是:那也是你說的!(我並沒有說是你寫的。)

    如果我就不理,其他人豈不以為:

     真的無解。

    = = = =

    問題不在 C / K&R / ANSI

    在 ARM 用的 C Compiler 目前還有支援!

    其實,我是程式設計學了超過25年才知道有 long float 這東西!

    當時也是嚇了我一跳!

    不過,本來就有學不完的東西。

    資訊業更是如此!

    我到現在還在旁聽資訊概論呢!

    = = = =

    如果我沒記錯,你們在戰那題時,我病得正嚴重。

    等我病好些,〝指〞戰已結束。

    我只回去隨便看了一下。

    2011-02-18 05:12:56 補充:

    如果我沒記錯,你們在戰那題時,我病得正嚴重。

    等我病好些,〝指〞戰已結束。

    我只回去隨便看了一下。

    那題好像還是我引起的!

    不過,我那是就事論事!

    就像我(應該是在那裡)題的:

    0 == a 的做法,不能解決

    b == a 的問題!

    因此,沒有真實效用!

    在缺少練習的情況下,遇到寫成 b = a 反而不利!

    而,當年軟工教授教這東西時,也已矛盾!

    並且,同學中,coding

    較弱的,都支持 0 == a,結果也沒變強!

    較強的,沒一個理它!結果也沒變弱!

    = = = =

    反對你 0 == a 的那位網友,應該不止在那一題反對你吧!

    而且,也(至少)還有另一位反對你!

    = = = =

    2011-02-18 05:13:16 補充:

    至少 3人 出〝指〞反對你,你還一直指責別人!!

    何不像你之前

     從某題起不再隨便答

    沒救!

還有問題?馬上發問,尋求解答。