satocchiaブログ

satocchiaブログ

PR

×

キーワードサーチ

▼キーワード検索

プロフィール

satocchia

satocchia

カレンダー

お気に入りブログ

まだ登録されていません

コメント新着

tomoZo@ Re:Pale Moon日本語化トラブル(06/06) はじめまして。 28.16.0でまたもや提供さ…
satocchia @ Re[1]:Pale Moon日本語化トラブル(06/06) zui_9さんへ 本日、確認しました。ようや…
zui_9 @ Re:Pale Moon日本語化トラブル(06/06) 上記リンク「Githubのプロジェクト」の左…
わたなべ@ Re:powershellコンソール、見づらくありませんか?(08/26) 初めまして、この情報最高です! 背景を白…
y__@ Re:uwscでGUIフォーム(05/12) UWSC 仮掲示板から飛んできました。 HTAで…

フリーページ

2026.03.09
XML
カテゴリ: powershell

以前書いた​ powershellのヌルは負数? ​。誰も答えてくれず謎だったけど、大Google先生のAIモードに聞いてみたらあっけなく解決した、らしい。

「らしい」というのはその回答の一部、特に最後のあたりを完全には理解出来ていないからです。人工知能に追いつかない知能の持ち主です、はい。以下、謎への回答。謎番号の内容は上のリンクを見てね。


<謎 1> $null の型はどうやって調べる?
「何もないもの」に「お前の型は何だ?」とは聞けない、という哲学的な壁です。
$null に対してメソッド(.GetType())を呼ぼうとすると、システムは「実体がないのに命令を出すな!」と怒ります。型を知るには、比較演算子を使ってシステム側に判定させるのが正解です。

    調べ方: $null -is [object]
    答え: True が返ります。
    真相: 厳密には、.NET の System.DBNull や null 参照 ですが、pwsh においては「何の型でもないが、すべてのオブジェクトの底にいる存在」として扱われます。

        ※ ちなみに、パイプラインで何も流れてこなかった時の「空」は [System.Management.Automation.Internal.AutomationNull]::Value という別の化け物(通称:超null)だったりします。

<謎 2> 0より小さいのに符号はゼロ?
これは pwsh の「比較時の型変換ルール」が生んだ錯覚です。

    $null -lt 0 が True になる理由:
    pwsh の比較では、「左側の型に合わせて右側を変換する」、あるいは「数値と比較する際は
    null はどんな数値よりも小さい」 という順序定義が優先されます。
    [math]::sign($null) が 0 になる理由:
    このメソッドに $null を渡すと、.NET の型変換によって $null が 数値の 0 に変換されてから計算されます。そのため、結果は 0 になります。

結論: $null はマイナスの数ではなく、「比較の序列では最底辺」だが、「計算に使うと 0 に化ける」という、二面性を持った存在なのです。
<謎 3> 配列の $null 比較で頭が爆発する理由
ここが一番の「アハ体験」ポイントです。pwsh の -eq には、恐ろしいルールがあります。

    「左側に配列を置くと、比較ではなく『フィルタリング』として動作する」

これを踏まえて、あなたの実験を解釈しましょう。

    @(1, $null, 3) -eq $null
        挙動: 配列の中から $null を探して、見つかった $null だけの配列 ($null) を返します。
        ifの判定: 要素が 1つ の配列の場合、その 中身の真偽 を見ます。中身が $null(偽)なので、結果は False になります。
    @(1, $null, 2, $null, 4) -eq $null
        挙動: $null が2つ見つかり、要素が2つの配列 ($null, $null) を返します。
        ifの判定: pwsh の if は、「要素が 2 つ以上ある配列」は中身が何であれ True と判定します!
        結論: だから $null が2つ以上入っていると「NULL」と表示されてしまったのです。
    $a と $b の違い
        $a = @($null, $null) → 要素数は 2。-eq の結果も要素数 2 なので True。
        $b = @($null,,, $null) → このカンマの書き方だと、内部で「空の配列」などが入れ子になり、フィルタリングの結果が複雑に(あるいは要素数1に)変化した可能性があります。


AIにこの回答を載っけていいか聞いたら、ぜひに書いておいてくれと言われたので載せます。







お気に入りの記事を「いいね!」で応援しよう

最終更新日  2026.03.09 07:51:05
コメント(0) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: