Flutter Tips
【Dart超初心者編 #6】実はややこしくないif文(前編)
先生01
姫野さん、こんにちは。
涼羽02
先生、こんにちは! バイトと講義の合間に、変数の復習ちゃんとしてきましたよ!

前回の記事はこちら↓↓↓

先生05
それは何よりです。
涼羽09
今回はどんなカッコいいプログラムを書くんでしょうか?
先生02
(カッコいいプログラムを書く前提なんだ……)
今回は「if文」について取り扱います。

if文の基本

涼羽01
もしも私が鳥ならば、あなたの元に飛んでいけるのに。
先生04
If I were a bird, I could fly to you.
涼羽03
(先生めっちゃ発音いい!)
先生01
「if文」と聞いて仮定法過去が思い浮かぶ姫野さんは、英語を熱心に勉強されていたのでしょうね。
涼羽15
ifで思いつくの、今言ったやつだけですけどね。仮定法は難しいってこともわかります。
先生02
ご安心を。プログラミングにおけるif文は極めて単純です。
涼羽11
え、そうなんですか? よかったー。
先生01
以下の例を見てみてください。
if(true){
	print("はい");
}
実行結果はい
先生02
if(条件式){A} は、「もし条件式がtrueならAを実行する」と翻訳できます。
涼羽23
すごくシンプル! 丸括弧の中には条件式? を入れるんですね!
先生01
もう少し詳しく言うと、丸括弧内の条件式には、比較演算や論理演算など、最終的に真偽値になるものであれば何でも記述できます。もちろん、真偽値の変数を直接書くこともできます
涼羽26
つまり、trueかfalseになれば計算もオッケー、と。前にやったトレーニングが活きてくるんですね!

比較演算・論理演算の記事はこちら↓↓↓

涼羽02
それで、中括弧の中にはtrueの時に何を実行するかを書くんですね。
先生01
はい。if文の構造は至極単純です。
涼羽09
中括弧の中にたくさんプログラムを書いてもいいんでしょうか?
先生04
はい。文法上はプログラムを何行にもわたって書くことが可能です。ただし、1つのif文の中身が何十行にもなってしまうとコードが読みにくくなるため、注意が必要です。
if(true){
	print("はい");
	print("はい");
	print("はい");
}
実行結果はい
はい
はい
先生01
視認性のため、中括弧が増えたらタブを1つ増やします。また、中括弧閉じ } はifのiの位置に合わせます
涼羽10
どこまでが中括弧の中身なのか一目瞭然ですね! でも、中括弧の始まりで改行しちゃダメなんですか?
先生02
Javaの前身であるC言語では、
if(a > 0)
{
  ~
}
のように中括弧で改行する書き方もありましたが、最近の言語ではふつう、
if(a > 0){
  ~
}
と記述するのが一般的です。
涼羽01
そうなんですね。
先生01
中括弧、特に括弧閉じ } を誤って二重にしたり、削除したりしないように注意しましょう。中括弧の対応に起因するエラーは、誤りが実際に起こった場所と、DartPadに指摘される場所とが異なるため、原因箇所が特定しにくい場合があります。
void main(){
	
	if(100 == 100){
		print("はい");
	//本来ここに書くはずのifの括弧閉じ}を誤って消してしまった場合

}//ここの「void main(){」用に書いていた中括弧閉じを、if用の括弧閉じだとDartPadが認識する

//プログラムの末尾で「void main(){」の括弧閉じが存在しない、というエラーになるため、ifの近辺に誤りがあると気付きにくいことがある
涼羽27
わかりました!
先生02
ifの基本の話はこのくらいです。ここまでで何か質問はありますか?
涼羽10
素朴な疑問なんですけど、丸括弧がfalseの時はどうなるんでしょうか?
先生01
いい質問ですね。思い立ったら実行してみましょう。
if(false){
	print("はい");
}
涼羽13
あれー!? DartPadで「Run」を押したのに何も起こりません!
先生02
はい。中括弧内には、丸括弧内がtrueの際に実行する内容が記述されています。したがって、丸括弧内がfalseの場合は何も実行されません。
涼羽15
DartPadが壊れちゃったのかと思いましたよ……。
先生01
ちなみに、if(false)と書いたことで、画面に何か変化が起きていませんか?
涼羽16
あ、何か情報? みたいなのが出てます! デッドコード? って何ですか?
先生02
「デッドコード」とは、絶対に実行されないコードのことです。if(false)のとき、{}内が実行されることはないため、DartPadがそれを教えてくれています。
涼羽11
親切ですね!

if(条件式){A} は、「もし条件式がtrueならAを実行する」と翻訳できます。
丸括弧内には、比較演算や論理演算など、最終的に真偽値になるものを記述します。
中括弧内には、trueの時に何を実行するかを記述します(この中括弧内の記述は、falseの時には実行されません)。
・視認性のため、中括弧が増えたらタブを1つ増やします。また、中括弧閉じ } はifのiの位置に合わせます

elseについて

涼羽15
でも、丸括弧がfalseの時に何か実行させたい時はどうすればいいんですか? trueの時だけ実行する、falseの時は何もしない、だけだと不便だと思うんですけど……。
先生02
いい質問ですね。真偽値がfalseの時に何か実行させたい場合は、elseを用います。
涼羽17
えるす?
先生02
if(条件式){A} else {B}は、「もし条件式がtrueならAを実行する。そうでなければ(条件式がfalseならば)Bを実行する」と翻訳できます。
涼羽24
えるす……えるす……あ、「そうでなければ」って意味ですね!
先生01
はい。この記述方法を用いると、trueの場合とfalseの場合の両方の実行方法を規定することができます。trueなら前半の中括弧、falseなら後半の中括弧を実行します。
涼羽25
なるほど! こんな感じですか?
if(false){
	print("はい");
} else {
	print("いいえ");
}
実行結果いいえ
先生02
素晴らしいです。書き方も問題ありません。タブを正しく使えていますし、elseの前後にきちんと半角スペースが入っていますね。
涼羽28
やったー!
先生01
今のプログラムのfalseをtrueに書き換えると、どうなるでしょうか。
涼羽26
そんなの簡単ですよ! 「はい」が出ます!
if(true){
	print("はい");
} else {
	print("いいえ");
}
実行結果はい
先生05
いいですね。
涼羽11
天才の姫野さん、今日も絶好調。
先生06
(あえてスルーしよう)
先生02
elseは必ず書かなければならないものではなく、省略することが可能です。
涼羽09
さっきまで書いてませんでしたもんね。でも、どういう時に省略できるんですか?
先生01
例えば、「このプログラムを本当に実行しますか」という時、「はい」「いいえ」を表示させて、「いいえ」を選んだ際に何も起きないようにする場合です。
bool running = false;
if(running){
	print("実行しています");
}
bool running = false;
if(running){
	print("実行しています");
} else {
}
先生02
姫野さん、この2つの実行結果はどうなると思いますか?
涼羽03
falseの時に何をするかが書いてないので、どちらとも何も起きないと思います。
先生02
その通りです。
涼羽23
じゃあ逆に、trueの時は何もしなくてよくて、falseの時だけ何かしたい時はこうすればいいんですね!
bool running = false;
if(running){
} else {
	print("いいえ");
}
先生04
きちんと動くので、決して間違ったコードではありませんよ。この例では、確かにrunningがtrueの場合には何もせず、falseの場合のみ「実行していません」と表示されます。
ただ後から見返すと「あれ? true側を書き忘れてしまったのかな?」と誤解を招くケースがあります。if文の特性上、条件がfalseの場合(else側)の記述は省略できるけれども、trueの場合(if側)の記述は省略できないために中括弧に何も書かない、とせざるを得ないんですね。
涼羽24
……ってことは、もっといい書き方があるんですか?
先生01
ありますよ! 先ほどの条件式を「!」で否定して、else側を省略すればいいだけです。
bool running = false;
if(!running){
	print("いいえ");
}
涼羽23
なるほど! 結局最初の基本形に戻るってことですね。

if(条件式){A} else {B}は、「もし条件式がtrueならAを実行する。そうでなければ(条件式がfalseならば)Bを実行する」と翻訳できます。
・丸括弧の真偽値がtrueなら前半の中括弧、falseなら後半の中括弧を実行します。
・elseは省略することが可能です。
・前半の中括弧は不要で後半の中括弧のみを記述したい場合、元の条件式や真偽値を「!」で否定することで、else以降を省略することが可能です。

else ifについて

先生02
次はelse ifについてお話しします。
涼羽09
えるすいふ? さっきやったelseの後ろにifをくっつけるんですか?
先生02
はい。以下に例を示しました。
int mathScore = 100; //数学の点数
if(mathScore >= 80) {
	print("優");
} else if (mathScore >= 60){
	print("良");
} else if (mathScore >= 30){
	print("可");
} else {
	print("不可");
}
涼羽01
else ifって何個もくっつけられるんですね! 数学で100点取ってみたかった!
先生02
実行結果はどのようになると思いますか?
涼羽02
数学の点数は100点だから、文句なしの「優」です。
実行結果
先生02
では、もしmathScoreが30の時はどうでしょうか?
涼羽21
うーん……。30は80点以上じゃないから「優」は出ませんよね。60点以上でもないから「良」でもない。えっと……30点以上? のところにはイコールが付いてる……ってことは、「可」ですか?
実行結果
先生01
正解です。条件式のイコールを取り除いて「mathScore > 30」にした場合はどうなるか、実行してみてくださいね。ここでポイントとなるのは、ifの丸括弧内がtrueである時、より下にあるifの丸括弧内の条件を満たしていても、その際の中括弧内は実行されないということです。
涼羽19
ええと、つまり……?
先生02
上記のプログラムにおいて、「優」の条件を満たす時、「良」「可」となる条件も満たしていますね。
涼羽23
あ、言われてみれば。80点以上ってことは60点以上だし、30点以上でもありますね。それなのに「良」「可」は出なくて「優」だけが出てます。
先生01
はい。if(条件式1){A} else if (条件式2){B}は、「もし条件式1がtrueならAを実行する。そうでなければ(条件式1がfalseという前提で)、もし条件式2がtrueならBを実行する」と翻訳できます。最後にelse{}を記述することで、全ての丸括弧内の真偽値がfalseである場合の実行内容を規定することができます。
涼羽09
なるほど。でもこれ、優とか良とか、別にelse ifを使わなくても表せませんか?
先生02
可能です。先ほどのプログラムを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("不可");
}
実行結果
涼羽04
ただのifだと、「80点未満60点以上」「60点未満30点以上」とか、細かく書かなきゃいけないんですね。何ていうか、else ifを使ったほうが見やすいですね。
先生02
else ifを用いれば、自動的に「80点未満」「60点未満」という条件が満たされますからね。
涼羽27
else ifは超便利……と。覚えました!
先生02
if文の説明は以上になります。

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

後編に続きます。

おすすめの記事