if (XXX == true) はNG

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

プログラミングでは条件分岐は必須事項と言える。その中でもif文は極めて初歩的な段階で習得するほど重要なものと言える。ただし、その条件分岐のルールは言語によって異なる場合があるので、それが落とし穴になってしまうこともある。今回はSwiftとC言語をベースにその部分を説明したい。

まず、Swiftでは、条件分岐を行う際は、最終的にBool型であることが必須となる [1]そうでない場合はコンパイルエラーとなる 。つまり、必ずtruefalseかであることが絶対条件となる。従って、if XXX == trueという書き方をしても実際の動作で問題になることはない [2]そもそもXXXの返り値がBool型でなければコンパイルエラーになる。 。もっとも、この記述方法は冗長なので、if XXXで十分である [3]falseであることを判定したい場合はif !XXXまたはif XXX == falseとする

C言語ではif (XXX == true)といった書き方は極めて危険である。

これはC言語の歴史的経緯から、論理値の概念がなく、整数で代用しているという事情がある [4]もっとも、C99ではstdbool.hより_Bool型が追加されたものの、実質的には整数である。 。多くの実装系ではtrueは1、false0として定義されている。

ただし、条件分岐のif文は、0か0以外かで条件を判定している [5]0ならfalse、0以外ならtrue 。このため、開発者によっては、「0か0以外で返せばいい」という考えに至ってしまい、false/trueが保証されることがない場合もある。

こういったことから、if (XXX == true)と書いてしまうと、XXXの処理の返り値について、0ならfalse、0以外ならtrueであるという保証がない場合、意図した動作にならない場合がでてしまう。従って、この場合は、if (XXX)と書かなければならない。

条件分岐は意外なところで落とし穴になるので、是非とも気をつけよう。

References

References
1 そうでない場合はコンパイルエラーとなる
2 そもそもXXXの返り値がBool型でなければコンパイルエラーになる。
3 falseであることを判定したい場合はif !XXXまたはif XXX == falseとする
4 もっとも、C99ではstdbool.hより_Bool型が追加されたものの、実質的には整数である。
5 0ならfalse、0以外ならtrue
タイトルとURLをコピーしました