G - 1.06.if文・比較演算子・論理演算子 /

Time Limit: 0 msec / Memory Limit: 0 KB

前のページ | 次のページ

キーポイント

  • if文を使うと「ある条件が正しい時だけ処理をする」というプログラムが書ける
  • else句を使うと「条件式が正しくなかった時」の処理を書ける
if (条件式1) {
  処理1
}
else if (条件式2) {
  処理2
}
else {
  処理3
}
  • 比較演算子
演算子 意味
x == y xとyは等しい
x != y xとyは等しくない
x > y xはyより大きい
x < y xはyより小さい
x >= y xはy以上
x <= y xはy以下
  • 論理演算子
演算子 意味 真になる時
!(条件式) 条件式の結果の反転 条件式が偽
条件式1 && 条件式2 条件式1が真 かつ 条件式2が真 条件式1と条件式2のどちらも真
条件式1 || 条件式2 条件式1が真 または 条件式2が真 条件式1と条件式2の少なくとも片方が真

if文

if文を使うと、ある条件が正しい時だけ処理をするというプログラムが書けるようになります。

書き方は次のようになります。

if (条件式) {
  処理
}

条件式が正しい時、{ から } の間の処理が実行され、条件式が正しくないとき、処理は飛ばされます。

次の例では、入力の値が10より小さければ「xは10より小さい」と出力した後「終了」と出力します。また、入力の値が10より小さくなければ「終了」とだけ出力します。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int x;
  cin >> x;

  if (x < 10) {
    cout << "xは10より小さい" << endl;
  }

  cout << "終了" << endl;
}
入力1
5
実行結果1
xは10より小さい
終了
入力2
15
実行結果2
終了

この例では、まず変数xに整数のデータを入力しています。

int x;
cin >> x;

重要なのはその後です。

if (x < 10) {
  cout << "xは10より小さい" << endl;
}

この部分は、「もしx < 10(xが10より小さい)なら、xは10より小さいと出力する」という意味になります。

最後にcout << "終了" << endl;を実行して終了と出力し、プログラムは終了します。

xが10より小さく無い場合は、

{
  cout << "xは10より小さい" << endl;
}

の処理は飛ばされます。そのため、2つ目の実行例では終了とだけ出力されています。

if文のように、何かの条件で処理が別れることを条件分岐といいます。
また、「条件式が正しい」ことを条件式が真、「条件式が正しくない」ことを条件式が偽といいます。以降からこの表現を使っていきます。


比較演算子

条件式のところには、多くの場合、比較演算子を使って条件を書きます。
比較演算子は以下の6つです。

演算子 意味
x == y xとyは等しい
x != y xとyは等しくない
x > y xはyより大きい
x < y xはyより小さい
x >= y xはy以上
x <= y xはy以下

「より大きい」「より小さい」を表す記号は数学と同じです。
「等しい」は=を2つ繋げたものになり、「等しくない」は!=の前につきます。
「以上」「以下」は、数学では「≧」「≦」のように=を下につけますが、C++では>=,<=のように右に=をつけます。

次のプログラムは、入力された整数値がどんな条件を満たしているかを出力するプログラムです。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int x;
  cin >> x;

  if (x < 10) {
    cout << "xは10より小さい" << endl;
  }

  if (x >= 20) {
    cout << "xは20以上" << endl;
  }

  if (x == 5) {
    cout << "xは5" << endl;
  }

  if (x != 100) {
    cout << "xは100ではない" << endl;
  }

  cout << "終了" << endl;
}
入力1
5
実行結果1
xは10より小さい
xは5
xは100ではない
終了
入力2
100
実行結果2
xは20以上
終了

論理演算子

条件式の中にはもっと複雑な条件を書くこともできます。そのためには論理演算子を使います。

演算子 意味 真になる時
!(条件式) 条件式の結果の反転 条件式が偽
条件式1 && 条件式2 条件式1が真 かつ 条件式2が真 条件式1と条件式2のどちらも真
条件式1 || 条件式2 条件式1が真 または 条件式2が真 条件式1と条件式2の少なくとも片方が真
#include <bits/stdc++.h>
using namespace std;

int main() {
  int x, y;
  cin >> x >> y;

  if (!(x == y)) {
    cout << "xとyは等しくない" << endl;
  }

  if (x == 10 && y == 10) {
    cout << "xとyは10" << endl;
  }

  if (x == 0 || y == 0) {
    cout << "xかyは0" << endl;
  }

  cout << "終了" << endl;
}
入力1
2 3
実行結果1
xとyは等しくない
終了
入力2
10 10
実行結果2
xとyは10
終了
入力3
0 8
実行結果3
xとyは等しくない
xかyは0
終了

「前の条件が真でないとき」の処理

else句

else句は、if文の後に書くことで、「if文の条件が偽の時」に処理を行えるようになります。
書き方は次のようになります。

if (条件式1) {
  処理1
}
else {
  処理2
}

次のプログラムは、入力の値が10より小さければ「xは10より小さい」と出力し、そうでなければ「xは10より小さくない」と出力します。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int x;
  cin >> x;

  if (x < 10) {
    cout << "xは10より小さい" << endl;
  }
  else {
    cout << "xは10より小さくない" << endl;
  }
}
入力1
5
実行結果1
xは10より小さい
入力2
15
実行結果2
xは10より小さくない

else if

else ifでは、「『前のif文の条件が偽』かつ『else ifの条件が真』」の時に処理が行われます。

書き方は次のようになります。

if (条件式1) {
  処理1
}
else if (条件式2) {
  処理2
}

処理2が実行されるのは、「条件式1が偽 かつ 条件式2が真」のときになります。

例を見てみましょう。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int x;
  cin >> x;

  if (x < 10) {
    cout << "xは10より小さい" << endl;
  }
  else if (x > 20) {
    cout << "xは10より小さくなくて、20より大きい" << endl;
  }
  else if (x == 15) {
    cout << "xは10より小さくなくて、20より大きくなくて、15である" << endl;
  }
  else {
    cout << "xは10より小さくなくて、20より大きくもなくて、15でもない" << endl;
  }
}
入力1
5
実行結果1
xは10より小さい
入力2
30
実行結果2
xは10より小さくなくて、20より大きい
入力3
15
実行結果3
xは10より小さくなくて、20より大きくなくて、15である
入力4
13
実行結果4
xは10より小さくなくて、20より大きくもなくて、15でもない

この例のように、else ifの後に続けてelse ifやelseを書くこともできます。


細かい話

細かい話なので、飛ばして問題を解いても良いです。

{ } の省略

今までif文やelse句、else ifは

if (条件式) {
  処理
}

と書いてきましたが、処理の部分が1文しか無い場合は、{ }を省略することができます。

if (x < 10)
  cout << "xは10より小さい" << endl;

「1文」とは、「セミコロンが1つだけで十分な処理」だと思えば良いです。
つまり、以下のような書き方は思った通りには動きません。

if (x < 10)
  cout << "xは10より小さい" << endl; cout << "Hello!" << endl;

これは次のように書いたのと同じ意味になります。

if (x < 10) {
  cout << "xは10より小さい" << endl;
}
cout << "Hello!" << endl;

if文のネスト

if文の中にif文を入れることをif文のネストと言います。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int x, y;
  cin >> x >> y;

  if (x == 10) {
    cout << "xは10" << endl;
    if (y == 10) {
      cout << "yも10" << endl;
    }
  }

  cout << "終了" << endl;
}
入力
10 10
実行結果
xは10
yも10
終了
入力
5 10
実行結果
終了

よくあるミス

==のつもりで=とだけ書いてしまわないように注意しましょう。

次のプログラムは「xが10と等しいか」を判定するプログラムの典型的なミスです。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int x;
  cin >> x;

  if (x = 10) {
    cout << "xは10" << endl;
  }
}
入力
5
実行結果
xは10

if (x = 10)のif文はxがどんな数値でも真だと判定されます。ハマりどころなので覚えておきましょう。なぜそうなるかは次の節で説明します。


問題

リンク先の問題を解いてください。

ABCの問題

ここまでの知識だけで解ける問題をAtCoder Beginner Contestから再び紹介します。練習問題だけでは物足りない人は解いてみてください。

前のページ | 次のページ