ユーニックス総合研究所

  • home
  • archives
  • programming-block

プログラミングのブロックとは?わかりやすく解説

プログラミングのブロックとは?わかりやすく解説

プログラミングにおけるブロックとは複数のコードが集まっているコードの区切りのことを言います。
複数のコードが集まっている様子から「ブロック」と言われています。

プログラミング言語によってコードのブロックに意味を持たせることもあります。
たとえば変数のスコープ(寿命)。
C言語などのプログラミング言語では変数のスコープはブロック単位になります。

つまりC言語ではブロックAで定義した変数はブロックBで使うことができません。
例外としてはブロックが違ってもポインタなどを使えば参照することはできます。
また例外としては入れ子になっているブロックでは子のブロックからや親のブロックの変数を見ることができます。

関連記事

目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
明快!C言語のcontinue文の使い方
君はまだC言語のdefineのすべてを知らない【マクロ、プリプロセス】
プログラミングのポインタをわかりやすく解説【C言語】
コードで見るC言語とC++の7つの違い

C言語などのブロックの表現

C言語などではブロックは波カッコ({})で表現されます。

{  
    int x = 0;  
}  

↑の場合、ブロック外ではxを参照することができません。
xの寿命は波カッコの内側で終わるからです。

入れ子になっているブロックは↓のように書きます。

{  
    int x = 0;  

    {  
        int y = 1;  
    }  
}  

変数xのいるブロックから変数yは参照できません。
しかし変数yのいるブロックからは変数xを参照できます。

また並列になっているブロックは↓のようになります。

{  
    int x = 0;  
}  
{  
    int y = 1;  
}  

この場合は変数xのブロックからyは参照できませんし、変数yのブロックからもxを参照できません。

Pythonなどのブロック

Pythonではブロックはインデントで表現します。
たとえばif文のブロックを見てみましょう。

x = 1  

if x == 1:  
    x *= 2  
    print(x)  

↑の場合はifに入れているインデントの範囲がそのif文のブロックです。
しかしPythonではC言語などと違ってブロックごとに変数のスコープが決められていません。
変数は定義した段階でその関数の中から参照することができます。

def func():  
    if True:  
        x = 1  

    print(x)  # 1  

func()  

たとえば↑のコードではif文のブロックで変数xを定義しています。
if文はTrueなのでif文のブロックは実行されます。よって変数xは定義されます。

そうするとブロックの外側のprint(x)の参照でxを参照することができます。
if文の条件式がFalseの場合はif文のブロックは実行されません。よって変数xも定義されません。

このようにブロックは言語ごとにその意味と作用が違っています。

JavaScriptなどのブロック

JavaScriptにもC言語と同じように波カッコのブロックがあります。
ただし変数の定義で見た場合、varletなどでその振る舞いが変わります。

varで定義した場合はスコープの外からでも参照することができます。
しかしletで定義した場合はその変数の寿命はそのスコープの範囲内に限定されます。

if (true) {  
    var x = 1;  
    let y = 2;  
}  

console.log(x);  // 1  
console.log(y);  // ReferenceError: y is not defined  

ブロックを使ったテクニック

C言語などでは波カッコによってブロックを作ることができます。
そのためこれを利用して変数のスコープを区切って処理を分割することができます。

void func(void) {  
    int x = 1;  
    // 色々な処理  

    {  
        int y = 0;  
        int z = 0;  
        // 色々な処理  
    }  

    x *= 2;  
    int y = 100;  
    int z = 200;  
    // 色々な処理  
}  

↑の途中の波カッコのブロックでは変数のスコープがその波カッコ内に限定されます。
そのため波カッコ内で定義したyzはブロックの外に影響しません。
これを利用すると同名の変数名を同じ関数内で使いまわすといったことも可能です。

しかしこのようなブロックによる区切りを必要とする場合、その多くはブロックを関数にしたほうがコードが綺麗になります。
関数もブロックを作ってコードを区切り、変数のスコープを区切るということになるので、このようなコードを書くよりは処理を関数化したほうがいいかもしれません。

ブロックの表現に言語の特徴が出る

プログラミング言語のブロックの表現はその言語の特徴がよく表れます。
というか言語設計の違いがよく出るので面白いです。

C言語、C++、Java、Go、Rustなどではブロックは波カッコを使いますし、Pythonではインデント、Rubyはキーワードを使います。
波カッコを使ったブロックの表現は人気がありこのような色々な言語で採用されています。

Padという言語はちょっと変わっていてブロックはコロンとendで表現されます。

def func():  
    puts("Hello, World!")  
end  

おわりに

今回はプログラミングのブロックとは何か? を解説しました。
ブロックについて理解することはプログラミング言語についての理解を深めることにも繋がります。

🦝 < ブロックで処理を区切ろう

🐭 < スコープも区切れる場合があるよ