わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

ifとelseを使いこなそう~1. 野球の先攻・後攻チーム

昨日の記事のある意味,続きです.int score[2][9];で宣言した2次元配列に,ある試合のジャイアンツとタイガース*1の各回の点数を格納しておき,文字のみでスコアボードを出力するプログラムを考えてみます.先攻となるジャイアンツの合計得点は,score[0][0]からscore[0][8]までの和,後攻めのタイガースについては,score[1][0]からscore[1][8]までの和として,計算できます.愚直にたし算をコード化するのではなく,2重ループを使うべきところです.
本日のテーマはその得点計算ではなく,各回の点数の前に,チーム名を出力するという話です.「for (i = 0; i <= 1; i++) {」と「}」を書き,中に入れる最初のコードが,次のとおりだと,うまくいくでしょうか?

if (i == 0) {
  printf("Giants|");
} else (i == 1) {
  printf("Tigers|");
}

いえ,これでは,コンパイルエラーとなります.「else」の直後に,ifやwhileと同じように「(条件式)」を書くことは,できません.
そこで次のように修正します.これならうまく動きます.

if (i == 0) {
  printf("Giants|");
} else {
  printf("Tigers|");
}

次のコードは,どうでしょうか.

if (i == 0) {
  printf("Giants|");
} else if (i == 1) {
  printf("Tigers|");
}

問題なく,動きますが,「Cらしいコード」とは言えません.forループにおいて,iのとる値は,0か1のどちらかなので,「if (i == 0)」が偽と判断されれば,iの値は必ず1となります.そういうときは,else ifは使うべきではありません.
それでも,else以降はiの値が1のときの処理なのだというのを,明示したければ…
コメントを書くという手があります.例えば以下のようにします.

if (i == 0) {
  printf("Giants|");
} else { /* i == 1 */
  printf("Tigers|");
}

*1:「なんでジャイアンツが先やねん」という熱狂的なタイガースファンの方は,阪神のホームゲームとお考えください.私もタイガースファンです.