PowerShell 第2回 And、Or条件を複数にした場合の短絡評価

#はじめに
色々な言語を使っていて、それを場合によって使い分けをします。
といっても、OfficeならVBA、それ以外の業務効率化は、今まではVB Script、これからはPowerShell、AlexaならNode.jsといった感じです。
なので、大したことありませんが、Visual Basic系とJava Script系ではかなり記載方法が違うので、書き方を混同して、VBAで書いてるときにJava Script構文で書いていたり、その逆があります。
よく間違えるのは、コメントアウトと、関数などの区切りを示す{}などです。そういったものは、Editorでエラーが出るのでそれほど気にならないのですが、それよりも、もうちょっと細かいところはよく忘れてしまって、どうだっけ？と調べたりするので、自分向けにすぐに見つかるように書き留めようと思いました。
今回は、And、およびOr条件の短絡評価です。PowerShell始めたばかりなのでそもそもどうなるのか知らないので試すことにします。

#今回実施する内容
今回は、And、Or条件を複数つないだ時の評価について記載します。

#ソースコード(Git Hub)
今回は短いため、なし。

#環境
OS: Windows 10 JP (64bit)
PowerShell version: 5.1.19041.1

#参考
[Everything you wanted to know about the if statement](https://docs.microsoft.com/ja-jp/powershell/scripting/learn/deep-dives/everything-about-if?view=powershell-7)
MicrosoftのPowershell説明に短絡評価に関する記載を見つけましたので載せます。

#用語
##短絡評価
Wikiなどにも載っていますが、論理演算子の計算の方法のひとつと思います。
式が複数あって、通常は左側の式からその内容を評価します。左側の式が条件を満たした場合、次の式は評価しないというのが短絡評価です。

#And条件の短絡評価
And条件は、`-and`のように記載します。
短絡評価されるかを調べます。

まずはネットを調べまして、Microsoftのページに記載がありました。
[Everything you wanted to know about the if statement](https://docs.microsoft.com/ja-jp/powershell/scripting/learn/deep-dives/everything-about-if?view=powershell-7)

>-and
>You can combine expressions with the -and operator. When you do that, both sides need to be true for the whole expression to be true.
>
>`if ( ($age -gt 13) -and ($age -lt 55) )`

>In that example, $age must be 13 or older for the left side and less than 55 for the right side. I added extra parentheses to make it clearer in that example but they're optional as long as the expression is simple. Here is the same example without them.

>`if ( $age -gt 13 -and $age -lt 55 )`
>
>Evaluation happens from left to right. If the first item evaluates to false, it exits early and doesn't perform the right comparison. This is handy when you need to make sure a value exists before you use it. For example, Test-Path throws an error if you give it a $null path.

>`if ( $null -ne $path -and (Test-Path -Path $path) )`

これをみると、Andは短絡評価になるようです。

それでは試してみます。

```powershell:AndTest.ps1
#And条件を複数にした場合の動作備忘

#####Main#####
$i = 0

if ($false -and $i++ -gt 1) {
	Write-Host $i
} else {
	Write-Host $i
}
```

if文には、二つの式があり、左辺は`false`、右辺は、`i++ -gt 0`です。
Andの短絡評価の場合、左辺が条件を満たさなければ満たさなければ、次の右辺は計算されませんので、今回の式では、i++は実施されません。
したがって、iの表示は、0になるはずです。
結果は、

```
0
```

想定通りです。

#Or条件の短絡評価
Or条件は、`-or`のように記載します。
短絡評価されるかを調べます。

まずはネットを調べまして、Microsoftのページに記載がありました。
[Everything you wanted to know about the if statement](https://docs.microsoft.com/ja-jp/powershell/scripting/learn/deep-dives/everything-about-if?view=powershell-7)

>-or
>The -or allows for you to specify two expressions and returns $true if either one of them is true.

>`if ( $age -le 13 -or $age -ge 55 )`
>Just like with the -and operator, the evaluation happens from left to right. Except that if the first part is true, then the whole statement is true and it doesn't process the rest of the expression.
>
>Also make note of how the syntax works for these operators. You need two separate expressions. I have seen users try to do something like this $value -eq 5 -or 6 without realizing their mistake.

これをみると、Orは短絡評価になるようです。

それでは試してみます。

```powershell:OrTest.ps1
#Or条件を複数にした場合の短絡評価

#####Main#####
$i = 0
if ($true -or $i++ -gt 0) {
	Write-Host $i
} else {
	Write-Host $i
}
```

if文には、二つの式があり、左辺はtrue、右辺は、i++ -gt 0です。
短絡評価の場合、左辺が条件を満たせば、次の右辺は計算されませんので、今回の式では、i++は実施されません。
したがって、iの表示は、0になるはずです。
結果は、

```
0
```

想定通りです。

#短絡評価のまとめ
まとめると、以下です。

|言語|短絡評価|
|:--|:--|
|PowerShell|あり|
|VBA|なし|
|Java Script|あり|

※VBA、Java Scriptはソースコードは載せませんが、こうなります。

#おわりに
And、Orの短絡評価についてまとめました。
まだまだ色々と学ぶことが多そうです。