<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 的基礎運用還是要盡量練習到熟悉,畢竟邏輯運算在條件判斷可說是不可或缺的。
所以你各位要多練題啊拜託ㄌ!!!!!(跪地哭