if (XXX == true) はNG

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

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

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

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

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

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

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

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

タイトルとURLをコピーしました