適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話など気になったことも載せているブログです。

PowerShellのショートサーキット(短絡評価)について

PowerShellのショートサーキット(短絡評価)

ふと、PowerShellにおける、ショートサーキット(短絡評価)ってどうなっているんだろうと疑問に思い調査してみました。

すると、stackoverflowで興味深い質問を見つけたので備忘録がてら書き残しておこおうと思います。

見つけたのはこちら⇒ c# - How to perform short-circuit evaluation in Windows PowerShell 4.0? - Stack Overflow

PowerShellのショートサーキット(短絡評価)についての話です。

ショートサーキットとは、論理演算において、左の式を評価した段階で真理値が確定する場合、右側の式については、評価を行わない動作のことです。

JavaやC#なんかだと||、&&と書きます。

PowerShellの場合、論理演算子である、-and、-orはデフォルトでショートサーキット(短絡評価)をするようです。

これまで全く気にしたことがありませんでしたが、今どきの言語はみんなデフォルトでこういう仕様なんでしょうか。

Wikipediaには各言語の短絡評価の有無が載っております。

主要な言語は、大体短絡評価の演算子を持っているのですね。

ちなみにVBAはちょっとしたテクニックを使わないと短絡評価を行うことができません。

おっと、話がそれてしまいました。

これは別の記事で紹介したいと思います。

公式ドキュメント

Microsoftの公式ドキュメントを見てみます。

PowerShell論理演算子は、ステートメントの真理値を決定するために必要なステートメントのみを評価します。and演算子を含むステートメントの左のオペランドがFALSEの場合、右のオペランドは評価されません。orステートメントを含むステートメントの左のオペランドがTRUEの場合、右のオペランドは評価されません。その結果、これらのステートメントは、Ifステートメントと同じ方法で使用できます。

公式ドキュメントより引用(Google翻訳により翻訳)

公式ドキュメントにもしっかり書かれていました。

このドキュメントを見ている人がどのくらいいるんでしょうか・・・。

では気を取り直して、実際にPowerShellの動作を確認してみようと思います。

動作検証

-andから。

PS C:\> 1 -eq 1 -and $(write-host "右オペランドだよ")
右オペランドだよ
False

左の式は1 -eq 1なのでTrue。左の式は条件を満たすので、右の式の評価が行われたことが確認できました。

PS C:\> 1 -eq 0 -and $(write-host "右オペランドだよ")
False

左の式は1 -eq 0なのでFalse。左の式が評価された段階でFalseが確定したので、右の式は評価されず、「右オペランドだよ」の文字列は出力されませんでした。

-or

PS C:\> 1 -eq 1 -or $(write-host "右オペランドだよ")
True

左の式は1 -eq 1なのでTrue。左の式を評価した段階でTrueが確定したので右の式は評価されず、「右オペランドだよ」の文字列は出力されませんでした。

PS C:\> 1 -eq 0 -or $(write-host "右オペランドだよ")
右オペランドだよ
False

左の式は1 -eq 0なのでFalse。左の式だけでは条件を満たさないので、右の式も評価され、「右オペランドだよ」の文字列が出力されました。

確かに-and、-orが短絡評価であることが確認できました。

終わりに

PoewrShellのショートサーキット(短絡評価)について紹介しました。

意識しなくても、はまることはないポイントかも知れませんが、知っていると何かの役に立つかも・・・ということで紹介してみました。

stackoverviewは本当に勉強になります。

ここまでお読みいただき、ありがとうございました。