複数のプログラミング言語から学ぼう

ここまでC言語を中心に、プログラミングについて考えてきたわね。
はい。
そろそろ、ほかのプログラミング言語を勉強してみるのもいいかもよ?
そうなんですか?C言語だけでも、まだまだ知らないことがたくさんありそうですけど……
ふふふ。だからこそ、って考えてみたらどうかしら。
だからこそ……ですか?
うん。例えばね、Swiftという言語があるわよね。これが誕生したのは2014年なのだけど……
えっと、スマホアプリとかの開発に使われてる言語ですよね。
そうそう。で、C言語が誕生したのが1972年頃だから、なんと40年以上も間があるの。
ええっ!40年以上?
びっくりよね……ということは、Swiftにはその分の知恵が詰まっていてもおかしくないわね。
たしかにっ!
もちろんC言語だって進化しているのだけど、何か新しい言語を知るのもプラスになると思うのよ。
なるほどー。そういうことなら勉強してみようかなぁ。
じゃあ、そのための練習を少しだけやってみましょうか。
わーい。お願いします!

C言語とSwiftのif文を比べてみよう

if文は、ほとんどのプログラミング言語に取り入れられている基本の文法です。C言語とSwiftのif文を比べてみると、何か分かることがあるでしょうか?

例えば、こんなC言語のif文があったとすると……
  int x = 123;

  if (x > 0)
    puts("Positive value");
  else
    puts("Negative value or Zero");
同じことをSwiftでやるには、こう!
  let x = 123

  if x > 0 {
    print("Positive value")
  } else {
    print("Negative value or Zero")
  }

いろいろと細かい違いはありますが、ここではif文の書き方にだけ注目することにしましょう。すると、次のことが分かります。

  • C言語では括弧(())が必須だけれど、Swiftでは不要
  • Swiftでは中括弧({})が必須だけれど、C言語では不要
へぇー。if文みたいな基本の文法でも、けっこう違うんですね!
うん。でも、ただ文法が違うだけだと思ってしまうのは、ちょっともったいないわね。
そうなんですか?
意外とこういうところに、先人の知恵が詰まっているものなのよ。
何だろう……僕、40年も生きてないし……
あはは。じゃあ、どうしてSwiftでは中括弧が必須になっているのか、理由を想像してみましょうか。

いつでもブロックを使おう

C言語のif文に、中括弧は必須ではありません。でも、中括弧を書かないと、プログラムが意図したとおりに動かない場合があります。

例えば、このif文は……
  int x = 123;

  if (x > 0)
    puts("Positive value"); /* こちらが実行されるように見えますが…… */
  else
    puts("Negative value");
    puts("or Zero");
実行結果(意図と違う)
Positive value
or Zero
そんなバカなっ!"or Zero"の行も実行されちゃいましたよ!
中括弧を書かなかったせいね。
上のプログラムは……実はこう書いたのと同じ!
  int x = 123;

  if (x > 0) {
    puts("Positive value");
  } else {
    puts("Negative value");
  }
  puts("or Zero");
あー、そうなっちゃうんですか……思ってたのと違いますね。
そうよね。元のプログラムのインデント(字下げ)を見れば、意図と違うのは明らかね。
もし最初から中括弧を書いていれば、プログラムはこうなっていたはず。
  int x = 123;

  if (x > 0) {
    puts("Positive value");
  } else {
    puts("Negative value");
    puts("or Zero");
  }
実行結果(意図したとおり)
Positive value

このように、C言語のif文では、いつも中括弧を書くようにするのがおすすめです。どこからどこまでがifelseに含まれる行なのかが明確になるため、思わぬ間違いを減らせます。

このとき、中括弧はif分の文法で定められたものではなく、ブロックだということを覚えておきましょう。本来は1つの文しか書けないところに、ブロックでまとめることによって複数の文を置いているのです。

ふむふむ。if文の中括弧はブロックだったんですね。えっと……じゃあ、for文やwhile文はどうなんですか?
うん。if文と同じことがいえるわね。
例えば、C言語でfor文をこう書くと……
  for (int i=0; i<10; i++)
    printf("%d\n", i);
    printf("--------\n");
これと同じ意味になってしまうから……
  for (int i=0; i<10; i++) {
    printf("%d\n", i);
  }
  printf("--------\n");
やっぱり中括弧が必要!
  for (int i=0; i<10; i++) {
    printf("%d\n", i);
    printf("--------\n");
  }
なるほどー。
ここがポイント!
ifforwhileなどでは、中括弧を省かないようにしましょう。意図と違う動作になるのを防げます。
さてさて。ここでSwiftの文法を思い出してみましょうか。もしif文に中括弧を書かなかったら……
えっと……Swiftでは中括弧が必須だから、文法エラーになっちゃうってことですか?
そう。C言語でやってしまいがちな間違いが、Swiftでは起こらないようになっているわけね。
あ!そっか、そういうことですか!
ありがたいことよね。

else ifって何だろう?

ところで、「C言語にはelse ifがない」って言ったらどう思う?
やだなぁ、あるじゃないですかー。
ふふふ、そう思うわよね。例えば……
C言語のelse ifはこんな感じで書くと思うけど……
  if (x > 0) {
    puts("Positive value");
  } else if (x < 0) {
    puts("Negative value");
  } else {
    puts("Zero");
  }
そうですよ!今まで何度も書いたことありますよ?
でも、C言語にelse ifっていう文法はないのよ。
はい?
これはね、文法じゃなくて、中括弧を省略できることを利用したテクニックなの。
さっきのelse ifは、実はこう書くのと同じ!
  if (x > 0) {
    puts("Positive value");
  } else { /* elseのあとの中括弧を省略したらelse ifになる */
    if (x < 0) {
      puts("Negative value");
    } else {
      puts("Zero");
    }
  }
えっ!elseの中にifがネストしてるのと同じってことですか?
そういうことね。よーく見たら分かるんじゃないかしら。
えぇーっと……たしかに同じかも……
ということは、else forなんていう書き方もできるわね。
例えば、これは……
  if (x > 0) {
    puts("Positive value");
  } else for (int i=x; i<0; i++) {
    printf("%d\n", i);
  }
こう書くのと同じ!
  if (x > 0) {
    puts("Positive value");
  } else {
    for (int i=x; i<0; i++) {
      printf("%d\n", i);
    }
  }
else forなんて、はじめて見ましたよー!
この先も見ないと思うわ。とても不自然な書き方だもの。
なーんだ。そういうことですか……
でも、else ifは自然だし、便利だからよく使うでしょう?
そうですね。完全に、そういう文法だと思ってましたもん。
そのへんもね、Swiftではしっかり整備されてるのよ。
Swiftのelse ifは、こんな感じ。
  if x > 0 {
    print("Positive value")
  } else if x < 0 {
    print("Negative value")
  } else {
    print("Zero")
  }
ふむふむ。C言語とそれほど変わらないですね……あれ?ちょっと待ってくださいよ……
ふふふ。気付いたかしら?
えっと、Swiftのif文は中括弧が必須でしたよね?
そうね。
だったら、どうしてelse ifが使えるんですか?elseifの間に中括弧がないとダメなのでは?
うん。これはね、Swiftにはelse ifっていう文法がちゃんとあるからなのよ。
わぁ、なるほど!へぇー。
ちなみに、else forはないわよ。
あ、それはいらないでーす!
ここがポイント!
プログラミング言語は、互いに影響を与えながら進化しています。新しい言語について知れば、C言語をもっと深く理解できるようになるかも知れませんね。

さて。

ここまで読んでいただき、ありがとうございました!C言語を中心にプログラミングにまつわる読み物をお届けしてきましたが、いかがだったでしょうか?少しでも「役に立った!」と思ってもらえたら、とても嬉しいです。

本シリーズは、基本的な内容からはじまって、だんだんと深掘りしていくような構成になっています。もし「途中から読んだよ」という場合は、ぜひ「記事一覧」に戻って、最初のほうもチェックしてみてください!

僕ももう1回、最初の記事から見直してみたいです!
そうね。同じ内容でも2回目には、何か新しい発見ができるかもしれないわね!