削除された内容 追加された内容
出典を追加。不正確な記述を排除。
C++に関して追記。
1行目:
{{複数の問題
|出典の明記=2024-0102
|独自研究=2024-0102
}}
{{小文字}}
14行目:
「真として(あるいは、偽として)扱うべき値」について詳説する。条件式の値が[[真理値]]をとる[[ブーリアン型]]でなければならない言語もあるが、そのように限定していない言語もある。C言語にはそもそもブーリアン型が無く{{code|int|c}}で代用しているが、条件式としては汎整数型のゼロ(0)の他、[[ヌルポインタ]]や[[浮動小数点数]]型の 0.0 なども偽として扱われる。[[Ruby]]ではnilとfalse以外は真として扱われる。[[JavaScript]]にはtruthyとfalsyという用語があり、falseの他いくつかの値がfalsyで、その他の多くの値はtruthyである。比較的少数の偽になる値の他は、真、という言語が多いが、それと逆に、[[Dart]]言語(のproduction mode)のようにtrue以外は偽という言語もある(checked modeではbool以外の型だとエラー)。
 
== 構文と構文以外など ==
以下ではいくつかの言語における、if文またはそれに類似したものの構文(syntax)と構文以外のことなどについて述べる。
=== C ===
if文の条件式はスカラー型の式である([[構造体]]や[[共用体]]のような[[複合型]]の式は使えない)<ref>[https://www.dii.uchile.cl/~daespino/files/Iso_C_1999_definition.pdf ISO/IEC 9899:1999 §6.8.4.1 The if statement]</ref>。[[C99]]よりも前の規格では真理値のみを扱うための型は無かったため、従来から{{code|int|c}}型で代用されてきた。整数値0に等しい値(あるいは暗黙変換によって0に等しくなる値)は偽、他の値は真として扱われる。真を代表して表すための値は整数値1である(比較式の結果は{{code|int|c}}型であり、0または1となることが保証されている<ref>[https://ja.cppreference.com/w/c/language/operator_comparison 比較演算子 - cppreference.com (C)]</ref>)。then節とelse節には、1個の文か、<code>{ }</code>で囲まれる複文([[ブロック (プログラミング)|ブロック]])を書く。
 
真の時だけ実行するとき
30行目:
else
else節
</syntaxhighlight>
<!-- 以下の例では、規格バージョンによらない構文であることを示すため、C99 で標準化された「//」の形式のコメントはあえて使っていない。 -->
 
複数の条件で分岐するときは以下のように書くことができる。
<syntaxhighlight lang="c">
int x = f();
if (x == 1) {
/* x の値が 1 のとき */
}
else if (x == 2) {
/* x の値が 2 のとき */
}
else {
/* x の値が 1 でもなく 2 でもないとき */
}
</syntaxhighlight>
 
実際には以下のようにif-elseの入れ子となっているだけである。
<syntaxhighlight lang="c">
int x = f();
if (x == 1) {
/* x の値が 1 のとき */
}
else
if (x == 2) {
/* x の値が 2 のとき */
}
else {
/* x の値が 1 でもなく 2 でもないとき */
}
</syntaxhighlight>
 
Cでは代入は文ではなく式であり値を返すため、以下のように条件式として代入式を使うこともできる。
<syntaxhighlight lang="c">
int x;
if (x = f()) {
/* x の値が 0 でないとき */
}
else {
/* x の値が 0 のとき */
}
</syntaxhighlight>
 
=== C++ ===
[[C++]]はCから発展した言語であり、構文なども概ね上位互換だが、細かな仕様において互換性のない部分も多い。
 
値として{{code|false|cpp}} (0) または{{code|true|cpp}} (1) のみを取りうる{{code|bool|cpp}}型を持っており、組み込みの型に対する比較式の結果は{{code|bool|cpp}}型となる<ref>[https://ja.cppreference.com/w/cpp/language/operator_comparison 比較演算子 - cppreference.com (C++)]</ref>。if文の条件式はこの{{code|bool|cpp}}型に暗黙的に変換可能な式を受け付ける。Cとの互換性のため、{{code|bool|cpp}}型は整数型の一種であり、その他の整数型や浮動小数点数型、ポインタ型などの値は、条件式の文脈において{{code|bool|cpp}}型に暗黙変換可能となっている。そのため、このような型<code>T</code>への暗黙変換演算子オーバーロード{{code|operator T()|cpp}}を持つユーザー定義型のインスタンスであれば、if文の条件式として使うことも可能である。
 
ただし暗黙変換は問題を引き起こすことが多い。安全のため、[[C++11]]では、明示的な型変換演算子オーバーロードを定義できる{{code|explicit operator T()|cpp}}の構文がサポートされた<ref>[https://cpprefjp.github.io/lang/cpp11/explicit_conversion_operator.html 明示的な型変換演算子のオーバーロード - cpprefjp C++日本語リファレンス]</ref>。<code>T</code>が{{code|bool|cpp}}の場合、条件式の文脈においては暗黙変換可能となる。
 
C++ではif文の条件式で変数を宣言することも可能である。変数の生存期間はそのif-else文を抜けるまでとなる。
<syntaxhighlight lang="c++">
if (int x = f()) {
// x の値が 0 でないとき。
}
else {
// x の値が 0 のとき。
}
</syntaxhighlight>
 
[[C++17]]では、if文における初期化と条件式を分離した構文が使えるようになった<ref>[https://cpprefjp.github.io/lang/cpp17/selection_statements_with_initializer.html if文とswitch文の条件式と初期化を分離 - cpprefjp C++日本語リファレンス]</ref>。
<syntaxhighlight lang="c++">
if (int x = f(); x == 123) {
// x の値が 123 のとき。
}
else {
// x の値が 123 でないとき。
}
</syntaxhighlight>