変数の宣言と初期化を理解する

変数の宣言は名前と型を決め、初期化は最初の値を与える操作です。ローカル変数には自動の初期値がないことを押さえ、代入・再代入・確定代入をコードの経路で判断します。

この単元で学ぶこと

  • 宣言・初期化・再代入を区別する
  • ローカル変数の確定代入を判定する
  • 型とスコープに沿って値の変化を追う

本文解説

宣言の構造 int count=3;は型int、名前count、初期化子3を持つ宣言文です。文末のセミコロンで終わります。int count;とcount=3;に分けても、読み取り前に代入すれば同じ値を利用できます。宣言と代入は関連しますが同じ操作ではありません。

右辺から左辺へ int n=4;n=n+2;は右辺で現在の4に2を足し、その6をnへ格納します。等式を永久に成立させる命令ではありません。System.out.print(n);は6を表示します。代入を行った時点で古い値はその変数から置き換わります。

初期化なしのローカル変数 main内のint n;System.out.print(n);はコンパイルエラーです。0が自動的に入る規則はフィールドや配列要素にあり、ローカル変数へは適用しません。まずint n=0;とするか、すべての経路で代入してから読みます。

複数の宣言子 int a=2,b=5;は同じ型の二変数を宣言します。int a=2,b=a+1;なら左のaを初期化した後にbへ3を入れます。int a,b=5;では初期化されるのはbだけです。カンマの右端の値が全部の変数へ入るわけではありません。

変数間の代入 int a=2;int b=a;a=7;ではbは2のままです。プリミティブ値をコピーする代入であり、bとaを結ぶ計算式を登録していません。実行を表にしてaとbの欄を別々に更新すると誤読を避けられます。

型は再代入で変わらない int n=2;n=2.5;はエラーです。一度intとして宣言したnはそのスコープでint型です。double n=2;n=2.5;なら小数を格納できます。値が変わることと、変数の宣言型が変わることを区別します。

条件分岐と確定代入 boolean flag=args.length>0;int n;if(flag){n=1;}else{n=2;}ならどちらの経路でもnを代入するため後で読めます。elseがなく、flagがfalseの経路で代入されないなら読めません。実行予定の引数に頼らず、コンパイラが経路を判定します。

初期化と自分自身 int n=n+1;では宣言中のnを値が入る前に読もうとしてエラーになります。前の行で別の同名ローカル変数を宣言しておく方法も同じスコープでは重複です。int n=1;n=n+1;のように初期化後に更新します。

図解

宣言から読み取りまで
ローカル変数は宣言しただけでは読み取れない。

重要ポイント

  • ローカル変数は読む前に値を代入する。
  • 代入は右辺の値を左辺の変数へ格納する。
  • 同じブロックで同名のローカル変数を重複宣言できない。
  • final変数には代入回数の制約がある。

間違えやすい点

  • 宣言だけで0が入ると考えない。
  • 変数のコピー後の再代入を別変数へ波及させない。
  • 代入の=と比較の==を区別する。

用語解説

宣言
変数の名前と型を導入する記述。
初期化
変数へ最初の値を与えること。
確定代入
変数を読む場所へ到達する全経路で代入済みと証明できる状態。
スコープ
その名前で変数を参照できるソースコードの範囲。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。