9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

if文の誤解

Last updated at Posted at 2017-07-15

 if 文について勘違いしている人をちらほらと見かけるので。

if 文とは

 ほとんどのプログラミング言語で同じはずですが、例えば C++ なら、

  if( 条件式 ) {}

というように考えていませんか? これは間違いで、実際には

  if( 真または偽 ) {}

です。
 ですので、if 文には true か false のどちらかを与える、というのが「基本的な」考え方です。(※言語によって if() 内には様々な書き方が許されますが、最終的には真または偽として解釈されます。)
 そして、if 文は引数が「真」の時に、{} 内の処理を実行する、という構文なのです。

条件式とは

 if 文の中に条件式を書く場合、「==」や「<=」といった比較演算子で条件を書くことが多いと思います。
 この比較演算子は「演算子」という名前の通り、与えられた条件で演算するもので、結果を true か false で返します。
 ですから、例えば

int a = 0;
if( a == 0 ) {}

これは次のように書き換えることができます。

int a = 0;
bool is_zero = (a == 0);
if( is_zero ) {}

 bool 型でないものが渡された場合、自動的に bool 型に変換してしまう言語もあるため、if() に渡される値が bool であるという認識をされていない方もいるのではないかと思います。
 数値型が渡された場合、0 以外なら true、0 なら false に自動的に変換されます。
 ポインタ型なら、NULL 以外なら true、NULL なら false に変換されます。
 C++ で operator bool() 関数をメンバに持つクラスが渡されたなら、この operator bool() 関数が呼ばれます。

※語弊がありそうなので削除しました。(2017/07/16)

だから何なのか?

自分がよく見かけるのは、以下のようなコード

bool is_zero( int a ) { return a == 0; }

void foo()
{
  int a = 0;
  if( is_zero(a) == true ) {}
}

is_zero() という関数が if 文にそのまま渡せるように bool 値を返しているにも関わらず、さらに true と比較している、というのが無駄です。これはシンプルに

  if( is_zero(a) ) {}

と書くべきです。否定なら

  if( !is_zero(a) ) {}

と書けばいいわけです。

9
12
11

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?