Operations Lab.

PowerShell の $a –eq $b と $b –eq $a は同じ結果とは限らない

leave a comment »

一言で言うと、タイトルの通りなのですが。他の言語を使用している方は、(普段使っている言語によっては)違和感があるかもしれません。

もともと、PowerShell の –eq 演算子は、配列(リスト)に適用したときと値型(Scalar Value)に適用したときで動作が異なります。が、値型同士の比較であっても、結果が異なる場合があります。

PS C:\> $true -eq 10
True
PS C:\> 10 -eq $true
False

$true は bool 型、10 は int 型で、ともに値型ですが、上記の通り異なる結果になります。これは、Boolean や Null ($null)と数値を比較した場合、右側のオペランド(被演算子)が左オペランドの型へ暗黙的にキャストされるためです。ですので、上の例は、以下と同等になります。

PS C:\> [bool]10
True
PS C:\> $true -eq [bool]10
True
PS C:\> [int]$true
1
PS C:\> 10 -eq [int]$true
False

ちなみに、通常の数値型(int や double 等)を –eq 演算子で比較した場合は、左オペランドの型へキャストされるのではなく、左右のオペランドのうち精度の高い型や範囲の広い型へキャストされます。(つまり、必ず左オペランドの型へキャストされるわけではありません。)

PS C:\> 10 -eq 10.1
False
PS C:\> 10.1 -eq 10
False
参考
広告

Written by kazu

2015/01/31 @ 11:30

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。