基本情報技術者の擬似言語をC#で読む:局所変数のスコープを図で理解する

広告

基本情報技術者試験の擬似言語で学ぶ「局所変数」は、C#のメソッド内で宣言する変数とほぼ同じ考え方で理解できます。

この記事では、擬似言語の例をC#に置き換えながら、局所変数がどこで作られ、どこまで使え、何を返すのかを図とコードで整理します。

基本情報技術者の擬似言語とC#における関数、局所変数、戻り値の比較図
擬似言語とC#は、引数を受け取り、局所変数で計算し、結果を返す流れが同じです。

まずは擬似言語とC#を対応させる

図の擬似言語では、整数型の引数 AB を受け取り、局所変数 答え に加算結果を代入してから返しています。

関数 整数型: 合計する(整数型: A, 整数型: B)
    整数型: 答え
    答え ← A + B
    return 答え
関数終了

C#では次のように書けます。

int Add(int a, int b)
{
    int answer = a + b;
    return answer;
}
役割擬似言語C#
関数・メソッドの定義関数 整数型: 合計する(…)int Add(...)
引数ABab
局所変数整数型: 答えint answer
代入答え ← A + Banswer = a + b;
戻り値return 答えreturn answer;

C#の局所変数とは

C#の局所変数(ローカル変数)は、メソッドや iffor などのブロック内で宣言される変数です。上の例では、次の1行で宣言している answer が局所変数です。

int answer = a + b;
  • int:変数に入れる値の型
  • answer:変数名
  • a + b:最初に代入する値

この変数は Add メソッドの処理中だけ利用します。別のメソッドから answer という名前を直接参照することはできません。

C#の局所変数answerはメソッド内で使え、returnで値だけを外へ返すことを示す図
return で外へ渡るのは計算結果の値です。局所変数 answer 自体をメソッド外から使えるようになるわけではありません。

重要:使える範囲は波かっこで決まる

変数名をコード上で利用できる範囲をスコープと呼びます。C#では基本的に、変数を宣言した位置から、その変数を囲む波かっこ { } の終わりまでがスコープです。

int Add(int a, int b)
{
    int answer = a + b;

    Console.WriteLine(answer); // 使える
    return answer;
}

// Console.WriteLine(answer);  // コンパイルエラー

最後の行では Add メソッドのブロックをすでに出ているため、answer は名前として認識されません。

ifブロックの中で宣言した変数

void CheckScore(int score)
{
    int border = 60;

    if (score >= border)
    {
        string message = "合格";
        Console.WriteLine(message); // 使える
    }

    Console.WriteLine(border);      // 使える
    // Console.WriteLine(message); // コンパイルエラー
}

border はメソッドのブロックで宣言したため、その後のメソッド内で使えます。一方、messageif ブロック内で宣言したため、閉じ波かっこを越えると使えません。

C#のメソッドブロックとifブロックにおける局所変数のスコープを示す図
内側のブロックで宣言した変数ほど、利用できる範囲は狭くなります。

擬似言語と比べるときの注意点

1. C#では宣言と代入を1行にまとめられる

擬似言語では宣言と代入を分ける例がよく見られます。

整数型: 答え
答え ← A + B

C#では、宣言と初期化を次のように1行で書くのが一般的です。

int answer = a + b;

2. C#の局所変数は自動で0にならない

フィールドとは異なり、C#の局所変数は宣言しただけでは利用できません。値を代入してから読む必要があります。

int answer;
// Console.WriteLine(answer); // 値が代入されていないためエラー

answer = 10;
Console.WriteLine(answer);    // 使える

これは「値が決まっていない変数をうっかり使う」ミスを、コンパイル時に防ぐ仕組みです。

3. returnすると処理はそこで終了する

return answer; が実行されると、Add メソッドの処理は終了し、呼び出し元へ値が返されます。returnの後に同じ流れで書かれた処理は実行できません。

呼び出し元では戻り値を別の変数で受け取る

int total = Add(3, 5);
Console.WriteLine(total); // 8

Add の中にある answer と、呼び出し元にある total は別の局所変数です。answer という変数そのものが外へ移動するのではなく、計算結果の値 8 が戻り値として渡されます。

最短形にもできる

計算結果を別の処理に使わず、そのまま返すだけなら局所変数を省略できます。

int Add(int a, int b)
{
    return a + b;
}

ただし、学習段階では answer のような局所変数を置くと、「入力 → 計算 → 戻り値」という流れを追いやすくなります。途中の値をデバッグで確認したい場合にも便利です。

まとめ

  • 擬似言語の局所変数は、C#ではメソッドやブロック内で宣言する変数に対応する
  • C#の局所変数は、宣言した位置から、その変数を囲む { } の終わりまで使える
  • 局所変数は値を代入してから読み取る必要がある
  • return で外へ渡すのは変数名ではなく値
  • 呼び出し元は、戻り値を別の変数で受け取れる

基本情報技術者試験の擬似言語では、まず「変数がどのブロックで宣言されたか」を確認しましょう。その視点をC#にも持ち込むと、スコープに関するコンパイルエラーや意図しない変数の使い方を減らせます。

訪問数 2 回, 今日の訪問数 2回

広告