if (XXX == true) はNG

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

まず、Swiftでは、条件分岐を行う際は、最終的にBool型であることが必須となる1 。つまり、必ずtruefalseかであることが絶対条件となる。従って、if XXX == trueという書き方をしても実際の動作で問題になることはない2 。もっとも、この記述方法は冗長なので、if XXXで十分である3

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

これはC言語の歴史的経緯から、論理値の概念がなく、整数で代用しているという事情がある4 。多くの実装系ではtrueは1、false0として定義されている。

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

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

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

ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。ご用の方はコメントかコンタクトフォームにて。
  1. そうでない場合はコンパイルエラーとなる []
  2. そもそもXXXの返り値がBool型でなければコンパイルエラーになる。 []
  3. falseであることを判定したい場合はif !XXXまたはif XXX == falseとする []
  4. もっとも、C99ではstdbool.hより_Bool型が追加されたものの、実質的には整数である。 []
  5. 0ならfalse、0以外ならtrue []
スポンサーリンク

フォローする