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

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

ただいまの
回答率

87.91%

elseと書いたらエラーになって、else ifになったらコンパイルできた理由について。

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,946

score 12

Javaの勉強をしています。以下のはswitchでも書けますが、ifで書くと、1つ目はコンパイルエラーになりました。

import java.io.*;
class Sample1
{
System.out.println("1〜5で成績を書いて下さい。");

public static void main(String[] args) throws IOException
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));

String str = br.readLine();
int num = Integer.parseInt(str);

if(num == 1 || num ==2)
{
System.out.println("もっと頑張りましょう。");
}
else if(num == 3)
{
System.out.println("努力が足りません。");
}
else if(num == 4)
{
System.out.println("なかなかの出来です。");
}
else if(num == 5)
{
System.out.println("良くできました!");
}
else(num == 0 || num > 5)
{
System.out.println("1〜5の数字を入力して下さい。")
}
}

else(num == 0 || num >5)を
else if(num == 0 || num > 5)にするとコンパイルするようになりました。

if文ではifが多く続き、それまでの選択肢に当てはまらないものは、
elseで書くようになっているのに、なぜ、elseと書くとコンパイルエラーになり、
else ifとなると、ちゃんとコンパイルされたのでしょうか?

ちなみに、elseにした場合は、eclipseでは、赤字で次のようにエラー表示されます。

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The left-hand side of an assignment must be a variable
Syntax error, insert "AssignmentOperator Expression" to complete assignment
Syntax error, insert";" to complete Statement

at ◯◯.if Sample1.main(if Sample.java:34)

上の英語(赤字エラー)の意味は一体、何になり、
なぜelseにしたらエラーになり、else ifでそれが解除されるのでしょうか?

どなたかアドバイスして下さいますと幸いです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Orlofsky

    2018/10/23 09:39

    コードは https://teratail.com/help#about-markdown の[コードを入力]を使ってください。

    キャンセル

回答 3

+4

if 構文をきちんと理解していないからです。

if (式) ~A else ~B は、式の値が真(true)ならば ~A を、そうでないならば ~B を処理します。
つまり else とはその前段にある式の結果に依存するので、else の後ろに判断式を書けません。
if (式1) ~A else if (式2) ~B' という構文は、上の if 分の ~B の部分に if (式2) ~B' が入っているだけなのです。かみ砕けばこうなります。

if (式1) {
  ~A
} else {
  if (式2) {
    ~B'
  }
}


※if 構文における ~A や ~B は、「文」もしくは「ブロック文」なので、else の直後に if 文を記述する({}を省略する)のは問題がありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

解決法はtacsheavenさんの回答がすべてなのですが、エラーメッセージを読み解くと、

The left-hand side of an assignment must be a variable

訳:代入の左辺は変数でなければいけません

Syntax error, insert "AssignmentOperator Expression" to complete assignment

訳:構文エラー、代入を完了するために「代入演算子」を挿入しなさい

Syntax error, insert";" to complete Statement

訳:命令文を完了するために";"を挿入しなさい

どういうことかというと、elseのあとの(num == 0 || num > 5)は条件文ではなく、通常のbooleanの演算と解釈されたのでしょう。だからその演算結果を代入する何かがないとおかしいですよ、と指摘しているのだとおもいます。

else
    boolean b = (num == 0 || num > 5);


こんな感じに書かれることを想定したのだと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

else {}


は、どの条件にも当てはまらなかったら実行するブロックです。

else(num == 0 || num >5)


は、さらに処理条件を追加しようとしていて、elseのルールから外れています。

条件1、条件2、その他(条件3)
と日本語で表現すれば、条件3は、条件1と2のどちらにも当てはまらないものだな、
と読み手が解釈してくれるかもしれないですが、システムでは解釈してくれないです。
また、負数や実数もあるので、(num == 0 || num >5)で、その他の条件を網羅してないです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る