ここまで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
文では、いつも中括弧を書くようにするのがおすすめです。どこからどこまでがif
やelse
に含まれる行なのかが明確になるため、思わぬ間違いを減らせます。
このとき、中括弧は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");
}
なるほどー。
ここがポイント!
if
やfor
、while
などでは、中括弧を省かないようにしましょう。意図と違う動作になるのを防げます。
さてさて。ここで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
が使えるんですか?else
とif
の間に中括弧がないとダメなのでは?
うん。これはね、Swiftには
else if
っていう文法がちゃんとあるからなのよ。
わぁ、なるほど!へぇー。
ちなみに、
else for
はないわよ。
あ、それはいらないでーす!
ここがポイント!
プログラミング言語は、互いに影響を与えながら進化しています。新しい言語について知れば、C言語をもっと深く理解できるようになるかも知れませんね。
さて。
ここまで読んでいただき、ありがとうございました!C言語を中心にプログラミングにまつわる読み物をお届けしてきましたが、いかがだったでしょうか?少しでも「役に立った!」と思ってもらえたら、とても嬉しいです。
本シリーズは、基本的な内容からはじまって、だんだんと深掘りしていくような構成になっています。もし「途中から読んだよ」という場合は、ぜひ「記事一覧」に戻って、最初のほうもチェックしてみてください!
僕ももう1回、最初の記事から見直してみたいです!
そうね。同じ内容でも2回目には、何か新しい発見ができるかもしれないわね!