作者lwecloud (CloudEX)
看板C_and_CPP
標題Re: [閒聊] 尋求比nest-if更優美的解決辦法
時間Tue Dec 7 11:52:30 2010
※ 引述《yauhh (喲)》之銘言:
: 當然善用shortcut-circuit evaluation寫邏輯句子很容易:
: (data == NULL) && printf("Data not found.")
: || (checkData(data) != 0) && printf("Data is invaild.")
: || (modifyData(data) != 0) && printf("Data modification failed.")
: || (fireDataChanged(data) != 0) && printf("Observer call failed.")
: || (saveDataIntoFile(data) != 0) && printf("Data storage failed.")
: || printf("Finally succeed...");
: 邏輯運算一般是 && 優先權高於 ||.
: → bdvstg:我看不懂... >"< 判斷&&列印||判斷&&列印...; 12/07 09:12
班門弄斧一下:
這樣的邏輯判斷其實只要知道"||"跟"&&"運算子的行為,其實並不難理解。
||運算子的情況:
A || B A和B只要其中一個成立(為TRUE),運算式即成立
如果A成立 => 運算式成立 (不做B,B會直接被忽略)
A不成立 => 檢查B是否成立(做B)
&&運算子的情況:
A && B A和B兩者皆必須成立(皆為TRUE),運算式才成立
如果A成立 => 檢查B是否也成立(做B)
A不成立 => 運算式不成立 (不做B,B會直接被忽略)
再回到yauhh板友的sample:
因為&&優先度高於||,所以你可以這樣看
╭ A1╮ ╭ B1╮ ╭ A2╮ ╭ B2╮
( 判斷(1)
&& 列印(1) )
|| ( 判斷(2)
&& 列印(2) ) ...下略
╰────α────╯ ╰────β────╯
&&運算子的情況:
如果A1成立 => 檢查B1是否也成立(做B1)
判斷(1)成立 =>
印錯誤訊息
(data == NULL) printf("Data not found.")
如果A1不成立 => 運算式α不成立(不做B1,B1會直接被忽略)
(data != NULL)
但是因為後面還有||運算子,所以
||運算子的情況:
α不成立 => 檢查β是否成立(做β)
而運算式β又是一個&&運算式,所以又回到上面
&&運算子的情況
依此類推
--
打完之後才發現光用文字解釋沒有想像中的容易orz
真是佩服板上的圖文詳解強者...
--
╭──╮┌──╮╭──╮╭──╮╭──╮╭─╮╮╭─╭╮
│ ││ ││ ││ ││ ││ │││ ││ NO16
│ ├╮│ ─┤│ ┘││ ││ ─ ││ ││ │█ █nyctenvoy
│ ││ ─┤│╮╭╯│││││╭╮│││ │╰╮╭╯█ ██ ██ ███
╰──╯└──╯╰╯╰ ╰╯╯╯╰╯╰╯╰╯─╯ ╰╯ ██ █▆◢ ▉█ ▊▊█
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.136.254.32
→ loveme00835:I don't care. 我不知道他在做啥不是我看不懂, 而是看 12/07 12:15
→ loveme00835:到 && 就沒繼續下去的必要 12/07 12:15
推 bdvstg:看懂了.... 感恩~~ (之前不曾想過可以這樣用) 12/07 12:41
→ lwecloud:我只是針對語意上面解釋,至於這種做法好不好,我想我 12/07 13:43
→ lwecloud:還是留給其他人評論吧XD 12/07 13:44
→ lwecloud: 應該說語法才對 12/07 13:44
推 awashharp:圖好精美XDDDD 12/07 15:56
→ yoco315:大哥,比起此串第三篇,這個寫法你花了一篇文章來解釋 12/07 19:42
→ yoco315:要說這個多好讀實在是騙鬼阿.. 好讀不好讀是相對的.. 12/07 19:43
→ yoco315:比起組合語言這大概是好讀啦,但是明明還很多比這好的寫法 12/07 19:43
推 yauhh:你的圖解超酷的 :D 12/07 19:51
推 bobhsiao:推~~有圖解 12/08 10:05