C_and_CPP 板


LINE

※ 引述《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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1587563631.A.ED1.html
1F:→ protoss: 的確問這類問題應該都還是新手...沒必要為這種扭在一起的 04/22 23:15
2F:→ protoss: 表達浪費人生...而且說實在的也看不出好處... 04/22 23:15
※ 編輯: loveme00835 (123.193.76.216 臺灣), 04/22/2020 23:19:51
3F:推 spong: 感謝L大深闢的解說,我懂囉ヽ(●′∀`●)ノ 04/23 14:40
4F:推 cphe: 先跳過... 糾結在這東西上面沒有太多實質上的幫助,或像這篇 04/25 16:54
5F:→ cphe: 說的換本書 04/25 16:54
6F:推 DLHZ: 04/25 19:32







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP