はじめに
- 新人エンジニア向けにプログラムの理解度を図るための練習問題を作ったので公開
- 別に解けなくてもヤバくない、これを機に知っていけば良い
- 言語はとりあえず
PHP
で書いてます
問1
以下のコードの出力を答えよ
function increment($a, $b, $c) {
echo $a . "\n";
echo $b . "\n";
echo $c . "\n";
}
$a = 0;
increment($a, $a++, ++$a);
問1の答え
0
0
2
これはインクリメントの評価順の問題です
後置インクリメント($a++
)は式を評価した後に加算する
よって$a
が加算される前に0で引数を渡し、その後に加算され1となる
前置インクリメント(++$a
)は式を評価する前に加算する
よって前のインクリメントで加算され1になっているところに更に加算し2にし、それを引数に渡す
よって答えは0,0,2となる
ポイントとしては左側から順に評価されるということです
$a
を渡す、$a
を渡してからインクリメント、インクリメントしてから$a
を渡す、という具合に左から読むと理解しやすいかと思います
問2
以下のコードの出力を答えよ
function return_true(){
echo "return_true関数が実行されました\n";
return true;
}
function return_false(){
echo "return_false関数が実行されました\n";
return false;
}
if(return_true() || return_false()){
echo "評価式はtrueでした\n";
} else {
echo "評価式はfalseでした\n";
}
問2の答え
return_true関数が実行されました
評価式はtrueでした
return_true() || return_false()
これの評価順が問題で、
AまたはBの時Aがtrue判定だと、Bはtrueでもfalseでも式全体はtrueになるためBは評価すらされません(return_false
の関数にすら入らない)
ポイントとしては評価式の確定ポイント以降は実行されないということです
これを知っておかないと例えばこの例の場合reeturn_false
内で他の処理を行っている場合に実行されず「なぜ???」となってしまいます。
問2類似
以下のコードの出力を答えよ
function return_true(){
echo "return_true関数が実行されました\n";
return true;
}
function return_false(){
echo "return_false関数が実行されました\n";
return false;
}
if(return_false() && return_true()){
echo "評価式はtrueでした\n";
} else {
echo "評価式はfalseでした\n";
}
問2類似の答え
return_false関数が実行されました
評価式はfalseでした
さっきとは逆でAかつBの条件式です。
これも先程の例と同様でAかつBでAがfalseの場合、Bはtrueでもfalseでも式全体はfalseになるためBは評価されません。
問2が理解できていれば解けましたよね?
問3
以下のコードの出力を答えよ
$test1 = '';
if(!!$test1){
echo "test1: 評価式はtrueでした\n";
} else {
echo "test1: 評価式はfalseでした\n";
}
$test2 = 'test';
if(!!$test2){
echo "test2: 評価式はtrueでした\n";
} else {
echo "test2: 評価式はfalseでした\n";
}
問3の答え
test1: 評価式はfalseでした
test2: 評価式はtrueでした
これは!!
がどういう意味を持つのかを知っていれば簡単ですね。
!
はNOTの意味を持ち、論理値を否定する効果があります。
例えば!true
と書くと評価式はfalse
になります。
では!!true
はどうでしょうか?これは否定の否定になるのでtrue
になります。
一見意味がないように見えますが、上の問題のように文字列や変数が存在するかどうかを手っ取り早く論理値に変換する時に重宝します。
覚えておきたいテクニックのひとつなんですがググろうとすると!!
って検索できないので案外知らない人が多い印象ですね。
おわりに
あくまで新人エンジニア向けなので大体の人は解けると思います。
悪い意味でヤバいエンジニアにならないように日々勉強していきましょう!