if文

各プログラミング言語での、if文の書き方。

まとめ

else if の書き方

else if派: C言語, C++, Go言語, Java, Scala, PHP(elseifも可), JavaScript, CoffeeScript
elseif派: Smarty
elsif派: Ruby, Perl
elif派: Python, sh

C言語, C++

if (...) {
  ...;
} else if (...) {
  ...;
} else {
  ...;
}

本体の文が1つだけの場合は {} を省略可。

if (...)
  ...;
else
  ...;

else で実行する文がなければ、else節を省略可。

Go言語

if ... {
  ...
} else if ... {
  ...
} else {
  ...
}

本体の文が1つだけの場合でも {} を省略不可。

else で実行する文がなければ、else節を省略可。

条件を書くの部分にセミコロンで区切って変数初期化の文を書くことができる。

if a := f(); a < 0 {
  return 0
} else {
  return a
}

行末の { は次の行に折り返してはいけない。次の行にしてしまうと、前の行に自動でセミコロンが挿入されて、意図した動作にならないかもしれない。

If statements | The Go Programming Language Specification
http://golang-jp.org/ref/spec#If_statements

Java

if (...) {
  ...;
} else if (...) {
  ...;
} else {
  ...;
}

本体の文が1つだけの場合はC言語と同様に {} を省略可。

if (...)
  ...;
else
  ...;

else で実行する文がなければ、else節を省略可。

条件式の部分は他の多くの言語と違い論理値への自動変換はされないので、 boolean型でないとコンパイルエラーが発生する。これは a == b のつもりで間違って a = b と書いてしまってもほとんどの場合はコンパイルエラーになってくれるので、実行時にバグとなることを防ぐことができる。 (abboolean型だと、代入文を書いてしまってもコンパイルエラーにはなってくれない。この点はScalaに劣る。)

Scalaのようにif文自体が値を返すことはできない。

The if Statement | Java Language Specification
http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.9

Scala

if (...) {
  ...;
} else if (...) {
  ...;
} else {
  ...;
}

本体の文が1つだけの場合はC言語と同様に {} を省略可。

if (...)
  ...;
else
  ...;

条件式の部分は他の多くの言語と違い論理値への自動変換はされないので、 Boolean型でないとコンパイルエラーが発生する。これはJavaと同様であり、これは a == b のつもりで間違って a = b と書いてしまってもコンパイルエラーになってくれるので、実行時にバグとなることを防ぐことができる。 (abBooleanであっても a = bUnit型になるので、 Javaと違い、間違って代入文を書くと必ずコンパイルエラーになる。)

Scalaではifは式であり、結果を返すことができるので以下のように 三項演算子の代わりとしても使える。

val max = if(a > b) a else b;

if式の返り値を変数に代入することもできる。

val a = if (...) {
  ...;
} else {
  ...;
}

if式にメソッド呼び出しをつなげることもできるが、このときは全体を括弧で囲む必要がある。

(if (...) {
  ...;
} else {
  ...;
}).foomethod(...);

PHP

if (...) {
  ...;
} else if (...) {
  ...;
} else {
  ...;
}

else if はつなげて elseif でも可。

本体の文が1つだけの場合はC言語と同様に {} を省略可。

if (...)
  ...;
else
  ...;

コロンを使った以下の記法も可能。コロンを使った場合は else if はコンパイルエラーになり、 elseif とすることが必要。

if (...):
  ...;
elseif (...):
  ...;
else:
  ...;
endif;

いずれの構文でも else で実行する文がなければ、else を省略可。

Smarty

{if ...}
  ...
{elseif}
  ...
{else}
  ...
{/if}

Python

if ...:
    ...
elif ...:
    ...
else:
    ...

書くべきステートメントが1つもない場合になにも書かないと文法エラーになってしまうが、 pass というステートメントを書くと、なにもしないということを明示できてエラーにもならない。

if ...:
    pass
else:
    ...

if文 | Python 2.7 documentation
http://docs.python.jp/2/reference/compound_stmts.html#if

if文 | Python 3 documentation
http://docs.python.jp/3/reference/compound_stmts.html#the-if-statement

ifを以下のように書くと結果を返すことができるので、 三項演算子のように使える。この if をPythonでは条件演算子という。

max = a if a > b else b

条件演算子 | Python 2.7 documentation
http://docs.python.jp/2/reference/expressions.html#conditional-expressions

条件演算子 | Python 3 documentation
http://docs.python.jp/3/reference/expressions.html#conditional-expressions

Ruby / JRuby

if ...
  ...
elsif ...
  ...
else
  ...
end

以下のように then を付けてもよいが、普通は省略する。

if ... then
  ...
elsif ... then
  ...
else
  ...
end

1行で全部を書きたい場合は then が必須になる。

if ... then ... else ... end

else で実行する文がなければ、else節を省略可。

else節がなく、本体の文が1つだけの場合は以下のように修飾子の構文での書き方も可能。この書き方は end を書く必要がなく行数が短くて済むため読みやすい場合が多い。

... if ...

if の反対で条件が満たされなかった場合にのみ実行する unless もある。

unless ...
  ...
end

やはり修飾子の書き方も可能。

... unless ...

unless にもelse節を付けられるがわかりづらいので使わないほうがよい。 elsunless というのはない。

RubyではScalaと同じく if は結果を返すことができるので、以下のように三項演算子の代わりとしても使える。ただし、ネストしていないなどシンプルな構造の場合は素直に三項演算子のほうがわかりやすい。

max = if a > b
        a
      else
        b
      end

Perl

if (...) {
    ...;
} elsif (...) {
    ...;
} else {
    ...;
}

本体の文が1つだけの場合でも {} で囲むことが必要で、C言語やJavaなどのように {} の省略ができない。

else で実行する文がなければ、else節を省略可。

else節がなく、本体の文が1つだけの場合は以下の修飾子の構文での書き方も可能。

... if ...;

if の反対で条件が満たされなかった場合にのみ実行する unless もある。

unless (...) {
    ...;
}

やはり修飾子の書き方も可能。

... unless ...;

unless にもelse節を付けられるがわかりづらいので使わないほうがよい。 elsunless というのはない。

sh (シェルスクリプト)

if ...; then
    ...
elif ...; then
    ...
else
    ...
fi

条件式の部分には普通のコマンドを書くことができて、コマンドが正常終了したら(終了コード0を返したら)条件成立の扱いになって、then以下が実行される。異常終了したら(0以外の終了コードを返したら)、else以下が実行される。

たいていのコマンドは何らかのエラーが発生すると、異常終了するようになっているので、シェルスクリプトのif文は、コマンドが正常終了したらなにかを実行する、という意味になる。

diffコマンドのように、エラーかどうかではなく、処理結果に応じて終了コードが変わるものもあるので、そういうのもif文との相性がよい。

else で実行する文がなければ、else節を省略可。

then の中や else の中にコマンドがひとつもないと bashであれば syntax error near unexpected token fi’、 Ubuntuに入っているデフォルトのsh(dash)であれば Syntax error: “fi” unexpected` というようなエラーが発生してしまう。 zshでは空でも大丈夫みたい。

空ではエラーになってしまうけど、空のままにしておきたい事情があれば、なにもしないコマンド : を書いておけばよい。

if ...; then
    :
fi

他の言語にあるような unless を使いたくなった場合は、条件としておくコマンドの前に否定の ! を置くとよい。

if ! ...; then
    ...
fi

testコマンド([)でも ! は否定の意味で使われる。

then は次の行に書くスタイルでもよくて、その場合は条件の最後のセミコロンが不要になる。

if ...
then
    ...
elif ...
then
    ...
else
    ...
fi

これらif文の話はsh系(bash等)の場合で、cshではif文の構文からして違うらしい。

JavaScript

if (...) {
  ...;
} else if (...) {
  ...;
} else {
  ...;
}

本体の文が1つだけの場合は {} を省略可。

if (...)
  ...;
else
  ...;

いずれの構文でも else で実行する文がなければ、else を省略可。

CoffeeScript

if ...
    ...
else if ...
    ...
else
    ...

または単一行で書く場合

if ... then ... else ...

elseだけを1行にまとめることができる。

if ...
    ...
else if ...
    ...
else ...

3項演算子としても使える。

a = if ... then ... else ...

Rubyのように修飾子の構文でも使える。

alert "hoge" if condition
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク