PHP で遊ぼう(8) – 真剣な間違え
ソフトウェアをつくる現場は、ほんの些細なワンミスが命取りになる繊細な場所。 そんな緊張感の中、真剣にやってるからこそ、みんなが大笑いしてしまうミス、2つ書いてみます。 🙂
—
たいていのプログラム言語には、変数の値の比較をする if という構文が備わっています。 たとえばこんなの。 (PHP ~ ってエントリ名でなぜか Java、、まぁ同じようなもんです :-)
- if(hoge > 10)
変数、hoge が 10 より大きかったら、ですね。
if でつかう比較演算子にはいろいろありますが、ちょっと特殊なのに ! というのがあります。 これはその後ろの式が否だったらという意味になり、、よく使われるのは「hoge は 5 以上かつ10以下”じゃなかったら”」なんて if を書きたいとき。
まず、「hoge は 5 以上かつ10以下のとき」の場合は
- if(hoge >= 5 && hoge <= 10)
となります。 両方を満たす必要があるので、AND を表す && で式を2つ書きます。
ふまえて「hoge は 5 以上かつ10以下”じゃなかったら”」 を普通に if で書こうとすると、「hoge は 4 以下”もしくは”11以上のとき」 となります。
- if(hoge <= 4 || hoge >= 11)
“もしくは” になるので、OR を表す || を使います。
で、面倒じゃないですか。 やりたいことは「hoge は 5 以上かつ10以下じゃないとき」なのにソースに 4 とか 11 とかよく分からん数字がでてきてしまう上に、AND を OR に逆転しなければいけません。 まちがえそーー。
ってわけで、ものぐさなプログラマは ! を使うのです。(←ものぐさじゃなくても使う
- if(!(hoge >= 5 && hoge <= 10))
! で後ろを否定するので、まさに “じゃなかったら”。 明確。 ソースコードは詩のように。 🙂
よく使う技法ですが、ここに笑いの神がぼくにおりてきました。
- if(!!(hoge >= 5 && hoge <= 10))
…。 なぜか ! をミスタイプしてふたつに。 そのまま、なぜか動作確認が通り試験に。
たなかさん、なんか動きおかしいですよ?。
またー、と思ってソースをみるひろまさ。
- if(!!(hoge >= 5 && hoge <= 10))
ゆうてる場合じゃない。 orz
…第一話、完。
—
たいていのプログラム言語には、変数の値の比較をする if という構文が備わっています。 たとえばこんなの。
- if(hoge == 10)
hoge が 10 だったら。 多くのプログラム言語では数学的な代入は = 、比較のイコールは == と使い分けます。 変数に値を入れたい場合は、 = を使います。
たなかさん、なんか動きおかしいですよ?。
またー、と思ってソースをみるひろまさ。
- hoge == 10;
ゆうてる場合じゃない。 orz
…第二話、完。
—
どっちも構文的には正解。 上の !! は否定の否定で肯定になります(もちろんバグ)。 3つ書いたらほんとに強い否定(笑)
下も、別にエラーにならず、比較だけされて素通り、値は入りません(もちろんバグ)
やぁ hiromasa.zone は勉強になりますねぇ。。(←おまえが勉強しろ
From: yuriko - 2007/6/8 Friday (Comment)
hoge が整数ならばそうですけど、整数じゃない場合はまずいですよね。こういうのは、ド・モルガンの法則 (==否定記号が各要素に分配される) を適用すれば、比較的簡単に否定条件が書けると思います。
!(hoge >= 5 && hoge <= 10)
!(hoge >= 5) ! && ! (hoge <= 10)
hoge < 5 || hoge > 10
プログラマーは、あるていど論理学の法則を知ってると思うのですが、実際はそうじゃないでしょうか?
From: ひろまさ - 2007/6/9 Saturday (Comment)
すいません。 ❗
お笑いネタ説明のため、紛れの少ない日本語での説明の上、言語に変換していますので、その辺はあるていどご容赦を。
ド・モルガンはご指摘の通りです。 ただ、”できる”のと”しない”のでは意味合いが違いますよね。 5 < = x <= 10 "じゃない"を書きたかったら、否定を使うのが正しい。 プログラム言語といえど表現の一つですので、わざわざ論理変換する必要がなければしないというのは定石でしょう。 >プログラマーは、あるていど論理学の法則を知ってると思うのですが、実際はそうじゃないでしょうか?
ぼく”以外”はできると思います。