LoginSignup
0
0

More than 3 years have passed since last update.

C言語のif文が実行されるのは条件式が非ゼロのとき。ただそれだけ。

Last updated at Posted at 2020-05-01

「え?if文?そんなの毎日使ってるからちゃんとわかってるよ♡」と思っていた自分を殴り倒したい案件が発生しました。
サンプルのコードは最初だけmain関数を書きましたが、他は省略します。

if文が実行される条件に対して私が勘違いしていた2つのこと

まず、if文が実行される条件を確認しましょう。
「条件式が非ゼロ」です。いいですか、みなさん。キーワードは「非ゼロ」です。

今までの私はsample1.cのようなif文を書いていました。

sample1.c
#include<stdio.h>
#include<stdbool.h>

int main() {
  bool result = true;

  if (result == true)
    printf("true\n");
  else
    printf("false\n");    

  return 0;
}
sample1
true

勘違い1:if文の条件式には演算子が必要だと思っていた

if文の説明を書いた本やwebを見ると、

疑似コード
if (条件) {
  ;
}

のように「if (条件)」と書いてあるものが多く、条件式というと個人的な感覚として

  • 等価演算子(==、!=)
  • 関係演算子(<、>、<=、>=)
  • 論理演算子(&&、||)

などを使わないといけないと思っていました。

if文が実行される条件に演算子の有無は関係ありません。条件式が非ゼロという事実があればいいんです。

ということは演算子の結果が非ゼロになっているはず…

sample2.c
  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);
sample2
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」と書く必要がありません。

sample3.c
  bool result = true;

  if (result)
    printf("true\n");
  else
    printf("false\n");    
sample3
true

勘違い2:if文の条件式の結果は0 or 1だと思っていた。

if文というと、true/falseのイメージが強く、sample4.cのようなコードは条件式が成立しないと思っていました。…反省。

sample4.c
  int x = 10;

  if (x)
    printf("OK!\n");
sample4
OK!

C言語のif文が実行されるのは条件式が非ゼロのとき。ただそれだけ。

if文の条件式は本当にシンプルでした。
ちょっとこれを意識すれば、コードを読むときや書くときに役に立つかもしれません。

0
0
0

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
0
0