彼は前職の後輩で、技術情報は良く収集する勉強熱心な性格で、自分の技術を活かせる場所が見つからなかったのか。
以前、一緒に仕事をすることがあったが、そんな彼のコードはちょっと不思議。言語はPHPだったが、if文の条件式が、論理演算ではなくビット演算だったのだ。
なぜかと質問したら、「結果は同じでしょ?省略系です」といったようなことを言われ、下記のような結果を見せられた。。見せられたのではなく書かされたのだったかも。
<?php
for ($i = 0; $i <= 1; $i++) {
for ($j = 0; $j <= 1; $j++) {
echo "a=$i b=$j\n";
logical_and($i, $j);
bit_and($i, $j);
logical_or($i, $j);
bit_or($i, $j);
}
}
function logical_and($a, $b) {
echo "logical_and: ";
if ($a && $b) {
echo "true\n";
} else {
echo "false\n";
}
}
function logical_or($a, $b) {
echo "logical_or: ";
if ($a || $b) {
echo "true\n";
} else {
echo "false\n";
}
}
function bit_and($a, $b) {
echo "bit_and: ";
if ($a & $b) {
echo "true\n";
} else {
echo "false\n";
}
}
function bit_or($a, $b) {
echo "bit_or: ";
if ($a | $b) {
echo "true\n";
} else {
echo "false\n";
}
}
結果:
a=0 b=0
logical_and: false
bit_and: false
logical_or: false
bit_or: false
a=0 b=1
logical_and: false
bit_and: false
logical_or: true
bit_or: true
a=1 b=0
logical_and: false
bit_and: false
logical_or: true
bit_or: true
a=1 b=1
logical_and: true
bit_and: true
logical_or: true
bit_or: true
はい。結果は同じです。同じですけども。やはり彼の省略コードはまちがっている。違いは式を評価するかしないか。論理積(AND)なら前式がFALSEなら、論理和(OR)なら前式がTRUEなら、後式は評価しない。当たり前のことだが、そもそも論理演算の代わりに、ビット演算を使おうなどと考えもしなかったので、一瞬騙されかけた。
<?php
false & print "A:やっはろー\n";
false && print "B:やっはろー\n";
true | print "C:やっはろー\n";
true || print "D:やっはろー\n";
結果:
A:やっはろー
C:やっはろー
お前が楽するために省略してどうするんだって話。CPUを楽させてやれと。まぁ、そんなことも昔の話、良い思い出。新たな場所でのさらなる活躍に期待。