
Python と C++ の違いについて語ってみる【ブロックはインデントで】
今日は処理のブロックについて。
「ブロック」と表現したものの、C++ で正確になんというのか。
Python では「スイート(suite)」と言います。
for 文や if 文のように条件付きで複数の文を実行するときがあります。
この「複数の文の塊」のことです。
if 文で複数の文を構成する場合、 C++ では次のように書きます。

この赤い部分が if ブロックです。
C++ ではブロックを { } で括ります。
ところが。
Python では、この { と } を取っ払ってしまったのです。
では、どうやってブロックの範囲を決めるのか。
それがインデントです。
Pythonでは、次の赤い枠内が全て if のブロックに入ります。

この「ブロック」の範囲を示すマークはありません。
ブロックから抜けるためにはインデントを戻す。
この場合、「print」は if ブロックには入りません。
思いきったことしましたよねぇ。
かつて、そんなプログラミング言語なんてあっただろうか。
C言語の系統は { } で括ります。
Basic は、If ~ Endif。
Fortran は、IF ~ ENDIF。(だったかな)
表現は違いますが、どれも
「ここからここまで」
という風にブロックの範囲を明示します。
Pythonではそれがない。
インデントだけでブロックの範囲を決定します。
C言語の系列では、ブロックとインデントの関係については常々問題視されていました。
例えば次のようなコードの場合・・・。
if (a == 0)
{
b = 12;
c = 13;
d = 14;
}
「“d = 14;”は if ブロックの外にある」
と思っちゃいますよね。
制御はあくまで { } で決めて、
インデントは読みやすくするための工夫でしかありません。
上記のコードは次のようにも書けたりするわけです。
if (a == 0){b = 12; c = 13; d = 14;}
さらには、必ずしも { } は必要ではありません。
if (a == 0)
b = 12;
c = 13;
d = 14;
これもコンパイルエラーにはなりません。
但し、この場合、 if の条件に入るのは次の赤い枠内だけです。

c と d に対する制御は if の条件外です。
でも、見た目は b も c も d も if の条件内と錯覚してしまいます。
これも間違いやすい書き方の一例です。
このため、C言語のコーディング規約には、
「ブロック内でタブを揃えること」
などという、いささかつまらない規約もあったりします。
Pythonは、それを抜本的に変えました。
ブロックの指定を { } などで決めるのではなく、
インデントで決める
ということにしたわけです。
ブロックはインデントで。
新しいプログラミング言語というのは、過去の言語の欠点を克服しようという姿勢はしばしば見られます。
Pythonはその急先鋒にいるのかもしれません。