<style> html, body, .ui-content { background-color: #333; color: #ddd; } body > .ui-infobar { display: none; } .ui-view-area > .ui-infobar { display: block; } .markdown-body h1{ color: #9CCEF2; } .markdown-body h2{ color: #B1D6CA; } .markdown-body h3{ color: #F5F6B6; } .markdown-body h4, .markdown-body h5, .markdown-body h6 { color: #ddd; } .markdown-body h1, .markdown-body h2 { border-bottom-color: #ffffff69; } .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: #fff; } .markdown-body img { background-color: transparent; } .ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a { color: white; border-left: 2px solid white; } .expand-toggle:hover, .expand-toggle:focus, .back-to-top:hover, .back-to-top:focus, .go-to-bottom:hover, .go-to-bottom:focus { color: white; } .ui-toc-dropdown { background-color: #333; } .ui-toc-label.btn { background-color: #191919; color: white; } .ui-toc-dropdown .nav>li>a:focus, .ui-toc-dropdown .nav>li>a:hover { color: white; border-left: 1px solid white; } .markdown-body blockquote { color: #bcbcbc; } .markdown-body table tr { background-color: #5f5f5f; } .markdown-body table tr:nth-child(2n) { background-color: #4f4f4f; } .markdown-body code, .markdown-body tt { color: #eee; background-color: rgba(230, 230, 230, 0.36); } a, .open-files-container li.selected a { color: #5EB7E0; } </style> ###### tags: `雜~~瓦魯多~~筆記` # or and orz? 若是需要兩個以上的條件判斷,那就少不了 *邏輯運算* 這個東東啦! 高二上數學(還是高一下?我忘ㄌ)的集合論那章,會大量用到這個觀念,那章很煩但是很好玩:) 如果已經懂基本觀念了,建議直接跳到 [一些「騷操作」](#一些「騷操作」) 這段開始看。 這裡是很有趣ㄉ地方,~~也是我寫這篇的目的,雖然好像實用性不大~~。 [TOC] ## 觀念簡單介紹 閱讀本篇時,請自動把所有的 `true` 都帶入「條件成立」。 程式裡面的 `true` 就是代表「條件成立」, `false` 則是「條件不成立」。 ### 且 若 `A 為 true` **且** `B 為 true` ,則 `A and B 為 true` 。 (兩者都為 `true` ) 兩個條件做 *且* 運算的結果如下: | | true | false | | --------- | ----- | ----- | | **true** | true | false | | **false** | false | false | ### 或 若 `A 為 true` **或** `B 為 true` ,則 `A and B 為 true` 。 (其中一個為 `true` ) 兩個條件做 *或* 運算的結果如下: | | true | false | | --------- | ---- | ----- | | **true** | true | true | | **false** | true | false | --- ## c++ 中的 且 與 或 C++ 中的條件判斷,也時常用到 *且* 與 *或*。 ### 且 與 或 的寫法 *且* 有兩種寫法,直接寫作 `and` 或是 `&&`: ```cpp= bool A, B; //兩個條件 if (A && B){ //... } if (A and B){ //... } ``` *或* 也一樣,可直接寫作 `or` 或是 `||`: ```cpp= bool A, B; //兩個條件 if (A || B){ //... } if (A or B){ //... } ``` --- ## 一些「騷操作」 ### C++ 在 and 與 or 判斷時的小作弊 理論上在做 `and` 與 `or` 時,兩個條件都要判斷嘛……不,這可不一定喔? * and `and` 運算時, `A and B` 成立的條件是 `A` 跟 `B` 都為 `true` 。 **換句話說,只要 `A` 與 `B` 其中一個不是 `true` ,那 `A and B` 就一定不會是 `true` 。** C++ 在接收到 `A and B` 這條判斷式時,它會先判斷 `A` 是 `true` 還是 `false` 。 -> 如果 `A` 是 `false` , `A and B` 就絕對不會是 `true` 。 那後面的 B 就會被跳過不執行,`A and B` 直接得到結果為 `false` 。 -> 如果 `A` 是 `true` ,那後面的 `B` 就會照常執行。 * or 在 `or` 的情況, `A or B` 成立的條件是 `A` 或 `B` 至少其中一個為 `true` 。 **換句話說,只要 `A` 與 `B` 其中一個是 `true` ,那 `A and B` 就一定是 `true` 。** C++ 在接收到 `A or B` 這條判斷式時,它會先判斷 `A` 是否為 `true` 還是 `false` 。 -> 如果 `A` 是 `true` , `A or B` 就一定是 `true` 。 那後面的 B 就會被直接跳過不執行,`A or B` 直接得到結果為 `true` 。 -> 如果 `A` 是 `false` ,那後面的 `B` 就會照常執行。 簡單來說, `A and B` 與 `A or B` 進行判斷時,會適當地跳過 `B` 的判斷,以此減少工作量。 那麼,可以利用這個小特性做什麼呢? <!-- ### 其他指令作為判斷式? `a == 0` 這個是判斷式。 `n >= 5` 這個也是判斷式。 那 `cin >> n` 這個……嗯?它是個……呃,動作?它是判斷式嗎? 這裡我們來複習一下,之前在 `while` 迴圈時,教過的一個用法: ```cpp= while(cin >> n){ //... } ``` 這段的功能是:重複輸入直到沒東西輸入時跳出迴圈。 `while` 在括號內的條件不成立時,迴圈就不會繼續執行,而 `cin >> n` 也可以被放在括號內。 所以 `cin >> n` 大致也能算是個判斷式,只是它得到的結果,是「有沒有輸入一個值」。 (註:專業一點的說法,應該是「有沒有遇到 `EOF` 」) 按照這個想法,判斷式不一定要是 `>=` `==` `<` 這類的數值比較,有時候可能長得比較不一樣。 能接受這一點的話,那請繼續往下看,體驗 `and` 與 `or` 的奧妙ㄅ。 --> ### 把以上的綜合應用 ~~<font color="000000">這東西超有趣,建議各位看個324遍,印出來放床邊:)</font>~~ 這裡就留給各位自行慢慢享受了: ```cpp= #include <iostream> using namespace std; int main(){ int a = 0; (cin>>a) && (cout<<a); (a==0) && (cout<<"Yaaaaa I luv AND\n"); (a!=0) && (cout<<"Nope AND would skip me"); (a!=0) || (cout<<"OR is da best"); (a==0) || (cout<<"Dope it's ignoring me"); } ``` 輸入如下: ``` 0 ``` 輸出如下: ``` 0 Yaaaaa I luv AND OR is da best ``` 也可以試試輸入 0 以外的數字觀察看看喔。 :::spoiler <font color="FEA0A0">**真的看不懂的話點這裡ㄅ**</font> 前面提過,`and` 與 `or` 會適當地跳過後面的條件「不執行」。 所以如果在後面的位置放一個 `cout` ,那它也會遵循這套規則,被第一個條件影響是否執行。 ```cpp= int a = 0; (cin>>a) || (cout<<a); //輸入 0 時 cin 即等於 true (就像是丟進 while 迴圈那種方式判斷) //(cin>>a) 為 true,因此後面的 cout 照常執行 (a==0) && (cout<<"Yaaaaa I luv AND\n"); //(a==0) 為 true,因此後面的 cout 照常執行 (a!=0) && (cout<<"Nope AND would skip me"); //(a!=0) 為 false,此 and 必為 false,因此後面的 cout 被跳過 (a!=0) || (cout<<"OR is da best"); //(a!=0) 為 false,因此後面的 cout 照常執行 (a==0) || (cout<<"Dope it's ignoring me"); //(a==0) 為 true,此 or 必為 true,因此後面的 cout 被跳過 ``` ::: ## 小結 嘛,說真的這篇又是一篇冷知識向的筆記了。 所以看不懂也沒關係,不了解 `and` 與 `or` 的細部機制也不會影響一般日常使用。 不過 and 與 or 的基礎運用還是要盡量練習到熟悉,畢竟邏輯運算在條件判斷可說是不可或缺的。 所以你各位要多練題啊拜託ㄌ!!!!!(跪地哭