# 3.3 複合條件判斷式

## 搭配使用邏輯運算子

底下是一個典型的帳密驗證程式片斷。

```C++
string id, password;

cin >> id;
cin >> password;

if(id=="admin")
{
    if(password=="123456")
    {
        cout << "登入成功" << endl;
    }
    else
    {
        cout << "登入失敗" << endl;
    }
}
else
{
    cout << "登入失敗" << endl;
}

```

因為「帳號正確」、「密碼正確」兩者皆需成立，所以使用了二層 `if...else` 敘述，看起來很累贅。

### And 邏輯運算子 &&

「帳號正確」**而且**「密碼正確」可以這樣表示。

```C++
string id, password;

cin >> id;
cin >> password;

if(id=="admin" && password=="123456")
{
    cout << "登入成功" << endl;
}
else
{
    cout << "登入失敗" << endl;
}
```
邏輯運算子可以對 **布林值(boolean)** 進行運算。

我們把 `id=="admin"` 視為**條件A**，`password=="123456` 視為**條件B**

條件A 的運算結果有兩種可能 true, false。條件B 也是一樣。所以 A and B 有四種可能狀況，表列如下。

|A|B|A && B|
|:--:|:--:|:--:|
|false|false|false|
|false|true|false|
|true|false|false|
|true|true|true|

這種表叫做 **「真值表(truth table)」** ，可以表示某個邏輯運算的各種狀態和運算結果，我們也很常用 0 表示 false，用 1 表示true。

|A|B|A && B|
|:--:|:--:|:--:|
|0|0|0|
|0|1|0|
|1|0|0|
|1|1|1|

由這張 And 的真值表可以看出只有在兩個條件都是 true 的情況下 A and B 的邏輯運算結練才會是 true，其他狀況都是 false。

### Or 邏輯運算子 ||

Or 的真值表如下，只要 A, B 其中之一為 true，運算結果就會是 true。

|A|B|A \|\| B|
|:--:|:--:|:--:|
|0|0|0|
|0|1|1|
|1|0|1|
|1|1|1|

如果獲得獎學金的資格是「國文成績85(含)以上」或「英文成績80(含)以上」，則我們可以用 Or 運算子這樣判斷個案是否可以領取獎學金。

```C++
if(chi>=85 || eng>=80)
{
    cout << "符合領取獎學金資格" << endl;
}
```
### Nor 邏輯運算子 !

And 和 Or 運算子左右各有一個運算元，所以我們稱之為 **二元運算子**。

Not 只有右邊一個運算元，所以它是 **一元運算子**。Not 的運算結果是把它後面那個運算元的真值反轉，也就是 true 變成 false，false 變成 true。

|A|!A|
|:--:|:--:|
|0|1|
|1|0|

我們可以這樣來過濾 $n$「不是 4 的倍數」

```C++
if(!(n%4==0))
{
    cout << n << "不是 4 的倍數" << endl;
}
```

<link rel=stylesheet type="text/css" href="https://nlmoodle.ddns.net/css/h.css">