Re: [問題] 關於三元運算子

看板C_and_CPP (C/C++)作者 (髮箍)時間5年前 (2020/04/22 21:53), 5年前編輯推噓3(303)
留言6則, 4人參與, 5年前最新討論串2/2 (看更多)
※ 引述《spong (請輸入ID)》之銘言: : 今天翻書突然看到c++條件運算子的問題 : 像c = a > b ? a : b 我可以理解 : 但當我翻到下一頁,看到以下程式碼 : int main(void) : { : const char x[2][20] = {"Jason ","at your service\n"}; : const char *y = "Quillstone"; : for(int i = 0;i<3;i++) : { : cout << ((i<2)? !i ? x[i]:y:x[1]); : } : return 0; : } : 我完全不了解 cout << ((i<2)? !i ? x[i]:y:x[1])這行的運作規則 : 請問要怎麼解釋那段程式呢?? 非常建議原 PO 換一本書來學習, 因為這份程式碼沒有任何道理. 即便你弄清楚它的流程, 你也學不到 ?: 的正確用法 (尤其放在迴 圈裡的時候). 首先可以把這份程式碼拿去編譯執行看看: https://wandbox.org/permlink/CUwEvD5BvPy1aRHb 可以發現輸出是 "Jason Quillstoneat your service", 程式碼裡 的每個字串常數剛好只出現一次, 而仔細看迴圈裡 ?: 用法: a ? b ? c : d : e c, d, e 敘述也都剛好各被輸出一次, 你可以用寫死的字串來驗證 看看: https://wandbox.org/permlink/CQsOUrkN59bBcY6r 那麼從左而右 ?: 裡的敘述基本上可以改寫為: ((i < 2) ? !i ? "Jason " : "Quillstone" : "at your service\n") (i == 0) (i == 1) (i == 2) ?: 的觀念和 if-else 類似, 搭配迴圈使用的話, 需要先知道索引 值和敘述的對應關係, 然後就是平鋪直敘地把它寫下來: ( i == 0 ? "Jason " // if (i == 0) "Jason " : i == 1 ? "Quillstone" // else if (i == 1) "Quillstone" : "at your service\n" // else "at your service\n" ) 然後再把寫死的字串用原本的變數給替換回來: ( i == 0 ? x[0] // it's unnecessary to use x[i] here : i == 1 ? y : x[1] ) 寫到這邊就可以結束了, 原本敘述裡 i < 2 就是想涵蓋 i == 0 以及 i == 1 兩種情況, 但後面的 !i 又是在唯二的情況下擇一求 值, 這就是我覺得沒有道理的地方 (多餘的條件引進不必要的複雜 度, 違反 zero-overhead principle). 當要在多種情況擇其一的時候, 需要盡可能地把條件變成具有正交 的, 不會彼此依賴, 這樣程式碼的結構就會趨於簡單, 而且往後 條件變動的話也不太需要大改. 這題我覺得和加不加括號沒關係, 即使 if-else 擠在同一行也不容易理解. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.193.76.216 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1587563631.A.ED1.html

04/22 23:15, 5年前 , 1F
的確問這類問題應該都還是新手...沒必要為這種扭在一起的
04/22 23:15, 1F

04/22 23:15, 5年前 , 2F
表達浪費人生...而且說實在的也看不出好處...
04/22 23:15, 2F
※ 編輯: loveme00835 (123.193.76.216 臺灣), 04/22/2020 23:19:51

04/23 14:40, 5年前 , 3F
感謝L大深闢的解說,我懂囉ヽ(●′∀`●)ノ
04/23 14:40, 3F

04/25 16:54, 5年前 , 4F
先跳過... 糾結在這東西上面沒有太多實質上的幫助,或像這篇
04/25 16:54, 4F

04/25 16:54, 5年前 , 5F
說的換本書
04/25 16:54, 5F

04/25 19:32, 5年前 , 6F
04/25 19:32, 6F
文章代碼(AID): #1Ue4nlxH (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1Ue4nlxH (C_and_CPP)