

姫野さん、こんにちは。

先生、こんにちは! バイトと講義の合間に、変数の復習ちゃんとしてきましたよ!
前回の記事はこちら↓↓↓

それは何よりです。

今回はどんなカッコいいプログラムを書くんでしょうか?

(カッコいいプログラムを書く前提なんだ……)
今回は「if文」について取り扱います。
今回は「if文」について取り扱います。
if文の基本

もしも私が鳥ならば、あなたの元に飛んでいけるのに。

If I were a bird, I could fly to you.

(先生めっちゃ発音いい!)

「if文」と聞いて仮定法過去が思い浮かぶ姫野さんは、英語を熱心に勉強されていたのでしょうね。

ifで思いつくの、今言ったやつだけですけどね。仮定法は難しいってこともわかります。

ご安心を。プログラミングにおけるif文は極めて単純です。

え、そうなんですか? よかったー。

以下の例を見てみてください。
if(true){
print("はい");
}
実行結果はい

if(条件式){A} は、「もし条件式がtrueならAを実行する」と翻訳できます。

すごくシンプル! 丸括弧の中には条件式? を入れるんですね!

もう少し詳しく言うと、丸括弧内の条件式には、比較演算や論理演算など、最終的に真偽値になるものであれば何でも記述できます。もちろん、真偽値の変数を直接書くこともできます。

つまり、trueかfalseになれば計算もオッケー、と。前にやったトレーニングが活きてくるんですね!
比較演算・論理演算の記事はこちら↓↓↓

それで、中括弧の中にはtrueの時に何を実行するかを書くんですね。

はい。if文の構造は至極単純です。

中括弧の中にたくさんプログラムを書いてもいいんでしょうか?

はい。文法上はプログラムを何行にもわたって書くことが可能です。ただし、1つのif文の中身が何十行にもなってしまうとコードが読みにくくなるため、注意が必要です。
if(true){
print("はい");
print("はい");
print("はい");
}
実行結果はい
はい
はい
はい
はい

視認性のため、中括弧が増えたらタブを1つ増やします。また、中括弧閉じ } はifのiの位置に合わせます。

どこまでが中括弧の中身なのか一目瞭然ですね! でも、中括弧の始まりで改行しちゃダメなんですか?

Javaの前身であるC言語では、
if(a > 0)
{
~
}
のように中括弧で改行する書き方もありましたが、最近の言語ではふつう、
if(a > 0){
~
}
と記述するのが一般的です。
if(a > 0)
{
~
}
のように中括弧で改行する書き方もありましたが、最近の言語ではふつう、
if(a > 0){
~
}
と記述するのが一般的です。

そうなんですね。

中括弧、特に括弧閉じ } を誤って二重にしたり、削除したりしないように注意しましょう。中括弧の対応に起因するエラーは、誤りが実際に起こった場所と、DartPadに指摘される場所とが異なるため、原因箇所が特定しにくい場合があります。
void main(){
if(100 == 100){
print("はい");
//本来ここに書くはずのifの括弧閉じ}を誤って消してしまった場合
}//ここの「void main(){」用に書いていた中括弧閉じを、if用の括弧閉じだとDartPadが認識する
//プログラムの末尾で「void main(){」の括弧閉じが存在しない、というエラーになるため、ifの近辺に誤りがあると気付きにくいことがある

わかりました!

ifの基本の話はこのくらいです。ここまでで何か質問はありますか?

素朴な疑問なんですけど、丸括弧がfalseの時はどうなるんでしょうか?

いい質問ですね。思い立ったら実行してみましょう。
if(false){
print("はい");
}

あれー!? DartPadで「Run」を押したのに何も起こりません!

はい。中括弧内には、丸括弧内がtrueの際に実行する内容が記述されています。したがって、丸括弧内がfalseの場合は何も実行されません。

DartPadが壊れちゃったのかと思いましたよ……。

ちなみに、if(false)と書いたことで、画面に何か変化が起きていませんか?

あ、何か情報? みたいなのが出てます! デッドコード? って何ですか?

「デッドコード」とは、絶対に実行されないコードのことです。if(false)のとき、{}内が実行されることはないため、DartPadがそれを教えてくれています。

親切ですね!
elseについて

でも、丸括弧がfalseの時に何か実行させたい時はどうすればいいんですか? trueの時だけ実行する、falseの時は何もしない、だけだと不便だと思うんですけど……。

いい質問ですね。真偽値がfalseの時に何か実行させたい場合は、elseを用います。

えるす?

if(条件式){A} else {B}は、「もし条件式がtrueならAを実行する。そうでなければ(条件式がfalseならば)Bを実行する」と翻訳できます。

えるす……えるす……あ、「そうでなければ」って意味ですね!

はい。この記述方法を用いると、trueの場合とfalseの場合の両方の実行方法を規定することができます。trueなら前半の中括弧、falseなら後半の中括弧を実行します。

なるほど! こんな感じですか?
if(false){
print("はい");
} else {
print("いいえ");
}
実行結果いいえ

素晴らしいです。書き方も問題ありません。タブを正しく使えていますし、elseの前後にきちんと半角スペースが入っていますね。

やったー!

今のプログラムのfalseをtrueに書き換えると、どうなるでしょうか。

そんなの簡単ですよ! 「はい」が出ます!
if(true){
print("はい");
} else {
print("いいえ");
}
実行結果はい

いいですね。

天才の姫野さん、今日も絶好調。

(あえてスルーしよう)

elseは必ず書かなければならないものではなく、省略することが可能です。

さっきまで書いてませんでしたもんね。でも、どういう時に省略できるんですか?

例えば、「このプログラムを本当に実行しますか」という時、「はい」「いいえ」を表示させて、「いいえ」を選んだ際に何も起きないようにする場合です。
bool running = false;
if(running){
print("実行しています");
}
bool running = false;
if(running){
print("実行しています");
} else {
}

姫野さん、この2つの実行結果はどうなると思いますか?

falseの時に何をするかが書いてないので、どちらとも何も起きないと思います。

その通りです。

じゃあ逆に、trueの時は何もしなくてよくて、falseの時だけ何かしたい時はこうすればいいんですね!
bool running = false;
if(running){
} else {
print("いいえ");
}

きちんと動くので、決して間違ったコードではありませんよ。この例では、確かにrunningがtrueの場合には何もせず、falseの場合のみ「実行していません」と表示されます。
ただ後から見返すと「あれ? true側を書き忘れてしまったのかな?」と誤解を招くケースがあります。if文の特性上、条件がfalseの場合(else側)の記述は省略できるけれども、trueの場合(if側)の記述は省略できないために中括弧に何も書かない、とせざるを得ないんですね。
ただ後から見返すと「あれ? true側を書き忘れてしまったのかな?」と誤解を招くケースがあります。if文の特性上、条件がfalseの場合(else側)の記述は省略できるけれども、trueの場合(if側)の記述は省略できないために中括弧に何も書かない、とせざるを得ないんですね。

……ってことは、もっといい書き方があるんですか?

ありますよ! 先ほどの条件式を「!」で否定して、else側を省略すればいいだけです。
bool running = false;
if(!running){
print("いいえ");
}

なるほど! 結局最初の基本形に戻るってことですね。
else ifについて

次はelse ifについてお話しします。

えるすいふ? さっきやったelseの後ろにifをくっつけるんですか?

はい。以下に例を示しました。
int mathScore = 100; //数学の点数
if(mathScore >= 80) {
print("優");
} else if (mathScore >= 60){
print("良");
} else if (mathScore >= 30){
print("可");
} else {
print("不可");
}

else ifって何個もくっつけられるんですね! 数学で100点取ってみたかった!

実行結果はどのようになると思いますか?

数学の点数は100点だから、文句なしの「優」です。
実行結果優

では、もしmathScoreが30の時はどうでしょうか?

うーん……。30は80点以上じゃないから「優」は出ませんよね。60点以上でもないから「良」でもない。えっと……30点以上? のところにはイコールが付いてる……ってことは、「可」ですか?
実行結果可

正解です。条件式のイコールを取り除いて「mathScore > 30」にした場合はどうなるか、実行してみてくださいね。ここでポイントとなるのは、ifの丸括弧内がtrueである時、より下にあるifの丸括弧内の条件を満たしていても、その際の中括弧内は実行されないということです。

ええと、つまり……?

上記のプログラムにおいて、「優」の条件を満たす時、「良」「可」となる条件も満たしていますね。

あ、言われてみれば。80点以上ってことは60点以上だし、30点以上でもありますね。それなのに「良」「可」は出なくて「優」だけが出てます。

はい。if(条件式1){A} else if (条件式2){B}は、「もし条件式1がtrueならAを実行する。そうでなければ(条件式1がfalseという前提で)、もし条件式2がtrueならBを実行する」と翻訳できます。最後にelse{}を記述することで、全ての丸括弧内の真偽値がfalseである場合の実行内容を規定することができます。

なるほど。でもこれ、優とか良とか、別にelse ifを使わなくても表せませんか?

可能です。先ほどのプログラムをelse if無しで記述すると、以下のようになります。else ifを使用するかしないかで書き方がどう変わるか、注目してみてください。
int mathScore = 59; //数学の点数
//else ifあり
if(mathScore >= 80) {
print("優");
} else if (mathScore >= 60){
print("良");
} else if (mathScore >= 30){
print("可");
} else {
print("不可");
}
//else if無し
if(mathScore >= 80){
print("優");
}
if(mathScore < 80 && mathScore >= 60){
print("良");
}
if(mathScore < 60 && mathScore >= 30){
print("可");
}
if(mathScore < 30){
print("不可");
}
実行結果可
可
可

ただのifだと、「80点未満60点以上」「60点未満30点以上」とか、細かく書かなきゃいけないんですね。何ていうか、else ifを使ったほうが見やすいですね。

else ifを用いれば、自動的に「80点未満」「60点未満」という条件が満たされますからね。

else ifは超便利……と。覚えました!

if文の説明は以上になります。
後編に続きます。