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

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

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

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

Q&A

解決済

4回答

1946閲覧

Javaの後置インクリメントについて

nicora

総合スコア11

Java

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

0グッド

1クリップ

投稿2019/06/24 03:38

Javaの後置インクリメントについて

お世話になります

Javaの学習中に後置インクリメントについて試していたところ
num = num++;
↑はコンパイルエラーにならずnumの値は変更されていませんでした。
ここでどのような処理がされているか教えてもらえないでしょうか

ちなみに
num++ = num;
↑は
test.java:10: エラー: 予期しない型
num++ = num;
と表示されました

###該当のソースコード

java

1public class test{ 2 public static void main(String[] args) { 3 int num = 0; 4 5 for(int i = 0; i < 5 ; i++){ 6 num = num++; 7 System.out.println(num); 8 } 9 10 for(int i = 0; i< 5 ; i++){ 11 num = num--; 12 System.out.println(num); 13 } 14 } 15}

実行結果

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

補足情報(FW/ツールのバージョンなど)

java version "1.8.0_211"

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

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

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

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

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

guest

回答4

0

ベストアンサー

Javaの場合、代入式は「左辺を評価する」「右辺を評価する」「代入する」の順序で処理が進みます(Java12規格書)。

なので、num = 0からnum = num++;と書くと、

  1. (左辺)numの変数参照を解決する
  2. (右辺)num++を実行する(いったんnum = 1となり、num++自体の結果は0が得られる)
  3. (代入)num = 0に戻る

という過程で動作が進行します。

投稿2019/06/24 04:17

maisumakun

総合スコア145183

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

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

nicora

2019/06/24 05:04

とても分かりやすく、もやもやがスッキリしました。 回答ありがとうございました。
guest

0

※回答者の推測を多く含みます。

後置インクリメントは対象の変数の値を1増やしますが、演算子の結果としては増える前の変数に入っていた値が得られます。

num++の結果としてnumは1になりますが、同時に0が返却されます。その0がnumに代入され、ずっと0になります。

投稿2019/06/24 04:07

swordone

総合スコア20651

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

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

gentaro

2019/06/24 04:12

優先順位上++の演算は先に行われるけど、演算子の戻り値は演算前の値なので、優先順位の低い代入が後で行われることによって演算前の値で上書きされ続ける、と解釈すればスッキリしますね。
guest

0

後置演算子を代入文で使用するとインクリメントされていない値が渡されるのは仕様なんで、

java

1int a = 1; 2int b = a++;

とするとa=2 b=1となるのは知っていたんですが、自己代入した場合は代入後にインクリメントされた値で更新されそうな感じがするので、簡単なようで微妙に難しい話ですね。

そのものズバリな解説記事がありました。
(前半部分の演算子の優先順位云々、はなんか誤解してそうな気はしますが)

まぁ、早い話が「そういうもの」なんですが。

投稿2019/06/24 04:02

gentaro

総合スコア8949

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

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

0

num = num++;

そのコードの動作は不定です

投稿2019/06/24 03:40

y_waiwai

総合スコア87749

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

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

maisumakun

2019/06/24 03:58

Javaでは評価順が決まっていますので、不定にはならないかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問