競技プログラミング用 知識集積所
if分岐
最終更新:
Bot(ページ名リンク)
-
view
雑な説明
変数の中身次第で特定のコードを実行したりしなかったりする。
あるいは、複数のコードのどれを実行するか選ぶ。
あるいは、複数のコードのどれを実行するか選ぶ。
レベル
ABCのA問題以降。
基本的な記述
コードを実行したりしなかったりしたい場合。
if (条件式) { その場合に実行したいコード }
複数のコードのどれを実行するか選ぶ場合。
if (条件式) { その場合に実行したいコード } else { そうじゃない場合に実行したいコード }
条件式に使える基本的な記述
等しい a==b
整数型の場合は、数値が等しければtrue。
double型の場合は、数値が等しければtrue……だが、あまり信用ならない(詳細はdouble型の注意点参照)
char型の場合は、同じ文字であればtrue。
string型の場合は、完全に同じ文字列であればtrue。
pair(未作成)、tuple(未作成)、vector(未作成)の場合は、個数と順番まで含め完全に同じ内容であればtrue。
set(未作成)の場合は、完全に同じ内容であればtrue。
double型の場合は、数値が等しければtrue……だが、あまり信用ならない(詳細はdouble型の注意点参照)
char型の場合は、同じ文字であればtrue。
string型の場合は、完全に同じ文字列であればtrue。
pair(未作成)、tuple(未作成)、vector(未作成)の場合は、個数と順番まで含め完全に同じ内容であればtrue。
set(未作成)の場合は、完全に同じ内容であればtrue。
等しくない a!=b
==がfalseになるならtrue。
より小さい a<b
整数型の場合は、数値がaの方が小さければtrue。
double型の場合は、数値がaの方が小さければtrue……だが、あまり信用ならない場合がある(詳細はdouble型の注意点参照)
char型の場合は、aの方がASCIIコードが小さければtrue。
string型の場合は、前から順に見て最初に異なる文字のところを探し、そこのASCIIコードがaの方が小さければ、またはaの方だけもう文字が尽きていればtrue。
pair(未作成)、tuple(未作成)、vector(未作成)の場合も前から順に見て最初に内容の異なるところを探し、そこがaの方が小さければ、またはaの方だけもう内容が尽きていればtrue。
double型の場合は、数値がaの方が小さければtrue……だが、あまり信用ならない場合がある(詳細はdouble型の注意点参照)
char型の場合は、aの方がASCIIコードが小さければtrue。
string型の場合は、前から順に見て最初に異なる文字のところを探し、そこのASCIIコードがaの方が小さければ、またはaの方だけもう文字が尽きていればtrue。
pair(未作成)、tuple(未作成)、vector(未作成)の場合も前から順に見て最初に内容の異なるところを探し、そこがaの方が小さければ、またはaの方だけもう内容が尽きていればtrue。
以下 a<=b
a<bかa==bが成り立てばtrue。
より大きい a>b
b<aが成り立てばtrue。
以上 a>=b
a>bかa==bが成り立てばtrue。
発展的な記述
aとbの間の数という判定
真面目に書くと、
if ((a<x&&x<b)||(b<x&&x<a))
とすることになり、やや煩雑。
実はこれ、
if ((x-a)*(x-b)<0)
と書ける。
ただし桁あふれに注意。
ただし桁あふれに注意。
あるいは、
if (min(a,b)<x&&x<max(a,b))
とも書ける。
そうじゃなければ、という条件(B問題レベル)
if (!条件) { そうじゃない場合に実行したいコード }
と書くことで、条件が成り立たなければ実行、を書くことができる。
単純な条件なら逆の意味の記号があるので必要ないが、例えば「queueが空じゃなかったら」という条件を
単純な条件なら逆の意味の記号があるので必要ないが、例えば「queueが空じゃなかったら」という条件を
if (!q.empty())
と書くような場合に必要になる。
3つ以上の分岐をしたい場合。
else if という書き方で
if (条件1) { 条件1を満たす場合に実行したいコード } else if (条件2) { 条件1を満たさないが条件2を満たす場合に実行したいコード } else { 条件1も条件2も満たさない場合に実行したいコード }
とする。
else if をさらに増やせば、たくさんある条件のうち初めて満たしたものによって実行内容を変えることができる。
else if をさらに増やせば、たくさんある条件のうち初めて満たしたものによって実行内容を変えることができる。
2つの条件をどちらもチェックしたい場合
2つの条件が両方成り立つなら実行、という場合は
if (条件1&&条件2)
2つの条件が片方だけでも成り立つなら実行、という場合は
if (条件1||条件2)
と書く。詳細はbool型参照。
3つや4つでも、個数が定まっているなら同様に書ける。
3つや4つでも、個数が定まっているなら同様に書ける。
多数(不定個)の条件を全てチェックしたい場合
bool型変数を用意して(または類する何らかの変数を用意して)forループで確認する。
全て成り立つ場合、と書きたい場合
全て成り立つ場合、と書きたい場合
bool flag = true; for (int i=0; i<n; i++) { if (条件iが成り立たないなら) flag = false; } if (flag) { 実行したい条件 }
1つでも成り立つ場合、と書きたい場合
bool flag = false; for (int i=0; i<n; i++) { if (条件iが成り立つなら) flag = true; } if (flag) { 実行したい条件 }
注意点
等しいと書くつもりで誤って=と書かないこと。
もし
if (x=0)
と書いた場合、意図と違う挙動をする。
これは、条件部分にbool型以外の値が入っていた場合でもそれぞれtrue扱いやfalse扱いにすると定めてあるため。
バグの発見が非常にしにくいので注意。
謎のWAが出た場合はとりあえずif文の中身を一通り確認してみる、くらいに警戒が必要。
これは、条件部分にbool型以外の値が入っていた場合でもそれぞれtrue扱いやfalse扱いにすると定めてあるため。
バグの発見が非常にしにくいので注意。
謎のWAが出た場合はとりあえずif文の中身を一通り確認してみる、くらいに警戒が必要。