「え?if文?そんなの毎日使ってるからちゃんとわかってるよ♡」と思っていた自分を殴り倒したい案件が発生しました。
サンプルのコードは最初だけmain関数を書きましたが、他は省略します。
if文が実行される条件に対して私が勘違いしていた2つのこと
まず、if文が実行される条件を確認しましょう。
**「条件式が非ゼロ」**です。いいですか、みなさん。キーワードは「**非ゼロ」**です。
今までの私はsample1.cのようなif文を書いていました。
#include<stdio.h>
#include<stdbool.h>
int main() {
bool result = true;
if (result == true)
printf("true\n");
else
printf("false\n");
return 0;
}
true
勘違い1:if文の条件式には演算子が必要だと思っていた
if文の説明を書いた本やwebを見ると、
if (条件) {
文;
}
のように「if (条件)」と書いてあるものが多く、条件式というと個人的な感覚として
- 等価演算子(==、!=)
- 関係演算子(<、>、<=、>=)
- 論理演算子(&&、||)
などを使わないといけないと思っていました。
if文が実行される条件に演算子の有無は関係ありません。条件式が非ゼロという事実があればいいんです。
ということは演算子の結果が非ゼロになっているはず…
int x1 = (1 == 1); // 等価演算子 成立
int x2 = (1 == 2); // 等価演算子 不成立
printf("x1 : %d, x2 : %d\n", x1, x2);
int y1 = (1 < 2); // 関係演算子 成立
int y2 = (1 < 1); // 関係演算子 不成立
printf("y1 : %d, y2 : %d\n", y1, y2);
int z1 = 1 && 1; // 論理演算子 1
int z2 = 1 && 0; // 論理演算子 0
printf("z1 : %d, z2 : %d\n", z1, z2);
x1 : 1, x2 : 0
y1 : 1, y2 : 0
z1 : 1, z2 : 0
論理演算子の結果が0 or 1なのは自明として、等価演算子と関係演算子は成立したときは1、不成立のときは0という結果を返すようです。
成立したときは1で非ゼロの条件を満たすから文が実行されるのですね。
sample1.cをもう一度確認してみると、result変数には0 or 1が格納されています。ということは等価演算子を使って「result == true」と書く必要がありません。
bool result = true;
if (result)
printf("true\n");
else
printf("false\n");
true
勘違い2:if文の条件式の結果は0 or 1だと思っていた。
if文というと、true/falseのイメージが強く、sample4.cのようなコードは条件式が成立しないと思っていました。…反省。
int x = 10;
if (x)
printf("OK!\n");
OK!
C言語のif文が実行されるのは条件式が非ゼロのとき。ただそれだけ。
if文の条件式は本当にシンプルでした。
ちょっとこれを意識すれば、コードを読むときや書くときに役に立つかもしれません。