質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

5回答

8831閲覧

int の初期値について

bonobiya

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/03/06 12:04

avaの問題集で
「正の整数値を読み込んで、その桁数を出力するプログラムを作成せよ」
(たとえば9999と入力したら
『4桁』
という表示がされるプログラムを作成せよ)
という問題をやっていたのですが、そこでintの初期値に関する事で疑問点がありました。
問題に対する私の答えとして以下のコードを実行使用したところ、エラーになってしまいました。エラー文は下に記載します。

java

1import java.util.Scanner; 2 3public class Main{ 4 public static void main(String[] args){ 5 Scanner stdIn = new Scanner(System.in); 6 7 System.out.println("正の整数値の桁数を求めます。"); 8 int x = stdIn.nextInt(); 9 System.out.println("正の整数値:"+x); 10 11 int keta; 12 while(x > 0){ 13 keta++; 14 x = x /10; 15 } 16 System.out.println("その数は"+keta+"桁です"); 17 } 18}

エラーメッセージは以下の通りです。

Main.java:13: error: variable keta might not have been initialized keta++; ^ Main.java:16: error: variable keta might not have been initialized System.out.println("その数は"+keta+"桁です"); ^ 2 errors

int keta;
のところを
int keta = 0;
に直したら正常に実行できたのですが、int のデフォルト値は0なのであえてint keta = 0と、初期値に0を入れなくても良い気がするのですが、私の勘違いでしょうか?
どなたかご解説いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

int のデフォルト値は0

これは
フィールドや配列の要素などは、省略した場合0で初期化されるという話で
ローカル変数には適用されません。

The Java® Language Specification

A local variable (§14.4, §14.14) must be explicitly given a value before it is used, by either initialization (§14.4) or assignment (§15.26), in a way that can be verified using the rules for definite assignment (§16 (Definite Assignment)).

投稿2017/03/06 12:24

編集2017/03/06 12:27
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ローカル変数は明示的に初期化が必要な言語仕様であることは他の方が回答されているとおりです。

その理由はおそらく・・・

  1. 自動初期化は往々にしてバグの元になる

あなたはintの変数の初期値は0であるのが自然と考えたわけですが、プログラム一般の話からすると初期値が0であることが常に自然かというとそうではありません。場合によっては別の初期値が用いられるであろうことは容易に想像できます。さてそんな場合、「本来0でない特定の値に初期化しなければプログラムとして正しくない論理」だったとして「プログラマーが初期化を忘れてしまったにもかかわらず自動的に0を初期値として仮定する」という言語仕様は「良い仕様」でしょうか。答えはおそらく「NO」です。そんな適当な仮定を置くよりは「変数の初期化忘れてますよ!どういう初期値にしたいんですか?」とコンパイルエラーになってくれた方がうれしいというのがJava設計者の考え方だったと思われます。

  1. プログラムで初期化しなくても必ず0で初期化するという言語仕様にしてしまったら・・・

1.を許容したとして、初期値を設定しなくても必ず0で初期化されることを保証するという言語仕様を考えてみます。さてプログラマーがバグのないプログラムを書いて、変数の値を0でない値に初期化するとしましょう。その場合、必要もないのに0で初期化されるということはそれだけ無駄な代入文を実行することを意味するので、無暗に実行速度を落とす要因になってしまいます。
ただしインタープリタ言語の多くではそういう仕様もあります。Visual Basicなんてのはそうですね。
Dim a as Integer
と書くと何も初期化しなくても0が仮定されます。インタープリタ言語は元々スピードを最優先に考えるのではなく使い勝手やコンパイルが必要ない点を重視するため「初期化ステップが入ったからといって何ほどのこともない」という考えで設計されるのだと思います。それに対してJavaなどのコンパイラー言語では「コンパイルという手間をかけるのだから可能な限りプログラムの正しさや効率を求める」思想で設計されます。そういう意味で「スピードを落とすような仕様」は合理的な理由がない限り避けられる傾向にあると思います。

投稿2017/03/06 14:07

編集2017/03/06 17:30
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2017/03/06 15:44 編集

失礼しました。大きな勘違いをしたコメントを残しましたが、撤回します。
guest

0

変数の初期化とは:SJC-P(310-035)対策Java用語集

Javaでは変数の種類に応じて、自動的に変数の初期化が行われる場合と、そうでない場合があります。

自動的に初期化されるかされないかの判断は以下の通りです。

クラスのフィールド(メンバ変数)は自動的に初期化される。

メソッドのローカル変数は自動的に初期化されない。

投稿2017/03/06 12:27

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

staticメソッド内だから初期化されないような気が・・・

面倒なので初期化しましょう。」が私の答えです。

言語によって仕様が変わります。
初期化されるのかされないのか、初期化される場合は0なのかnullなのかundefinedなのか考えるよりも最初から入れておけばバグは減るので

「無駄な初期化」とコードレビューで指摘されたこともありますが、安全第一。

ただし、for・whileなどのループでは変数宣言の場所や初期値には気をつけておかないとメモリや処理速度が悲惨なことになることも
ここらは経験ですかね。

投稿2017/03/07 00:08

mosapride

総合スコア1480

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

インスタンス変数はどこから値が設定されてどこから使用されるかわからない状態です。
そのため、どこで使用されてもいいようにデフォルトの値が決まっています。

一方、ローカル変数はそのメソッド内で値を設定し、使用する以外の用途がありません。
そんな変数を、値を設定せず使うという状態はおかしいので、デフォルトの初期値が決まっておらず、
コンパイルエラーを出すのです。

投稿2017/03/06 15:15

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問