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

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

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

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

Q&A

解決済

4回答

851閲覧

後置きインクリメント

hinata0812

総合スコア14

Java

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

0グッド

1クリップ

投稿2021/12/11 11:08

編集2021/12/11 11:09

初歩的な質問申し訳ありません。
下記コードで質問なですが、numという変数の前置き、後置きインクリメントで
代入式は「左辺を評価する」「右辺を評価する」「代入する」の順序で処理が進むとおもうのですが、
下記コードでは
num=num++;の部分では、左辺が評価された後に、右辺のnum++;でここでは1を使用しているので先に1を左辺に代入した後に
+1されると認識していたのですが、なぜ同じ数字が出力されるのでしょうか?
ご教授いただけると幸いです。

int num = 1; int n; for(int a = 0; a < 5 ; a++){       num=num++;       System.out.println(num);

出力結果
1
1
1
1
1

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

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

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

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

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

guest

回答4

0

後置インクリメントは、代入した後(文の実行が終わった後)でもなく、代入の右辺を評価し終わった後でもなく、n++を評価した直後に行われます。

Javaの被演算項の評価は左から順番に行われますので、例えば、

Java

1n = 1; 2n += n++ * n;

の2行目だと、まず代入左辺のnの値が1と評価され、n++1と評価され、直後にn2になり、次に乗算右項のn2と評価されます。nには1+1*23が代入されます。

投稿2021/12/11 12:11

otn

総合スコア84808

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

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

xebme

2021/12/11 23:37

++ はバイトコードの iinc 命令に変換されます。iinc 命令はローカル変数(num)を直接(2に)書き換えます。しかし、演算はオペランドスタック上で行われ、スタックのトップにある結果(1)がローカル変数(num)に代入されます。演算の過程でnumは2ですが、最後の代入で1に上書きされます。
guest

0

変数をひとつ用意して、num = num++の結果をふたつのステップにわけてみては?

java

1public class xxHoge { 2 public static void main(final String[] args) { 3 int num = 1; 4 for (int a = 0; a < 5; a++) { 5 // num=num++; 6 // System.out.println(num); 7 System.out.println(String.format(" -- a:%s", a)); 8 final int tmp = num++; 9 System.out.println(String.format(" tmp = num++; ... tmp:%d, num:%d", tmp, num)); 10 num = tmp; 11 System.out.println(String.format(" num = tmp; ... tmp:%d, num:%d", tmp, num)); 12 } 13 } 14}
// -- a:0 // tmp = num++; ... tmp:1, num:2 // num = tmp; ... tmp:1, num:1 // -- a:1 // tmp = num++; ... tmp:1, num:2 // num = tmp; ... tmp:1, num:1 // -- a:2 // tmp = num++; ... tmp:1, num:2 // num = tmp; ... tmp:1, num:1 // -- a:3 // tmp = num++; ... tmp:1, num:2 // num = tmp; ... tmp:1, num:1 // -- a:4 // tmp = num++; ... tmp:1, num:2 // num = tmp; ... tmp:1, num:1

投稿2021/12/11 14:03

shiketa

総合スコア3990

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

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

0

ベストアンサー

https://teratail.com/questions/190557#reply-283033
こちらの回答がとても参考になると思いますので、是非ご覧になってください。

int num = 1;
num = num++

まず num++ が評価されます これは1ですね。
num = 1 ;となります。
しかし、num++はnumの値1を返すと同時にnumの値を1増やします。
numの値は 2になります。
しかし num = num++ の式としては num = 1 ;
変数numに1を代入する のまま変わらないので
num の値は1になります。

代入後にnumの値が加算されるわけではありません。

num=num++ + num ;

を考えると わかりやすいと思います。
まずnum++が評価されるので
num = 1 + num ;
そしてnum++ なので numの値は1増えて2になります。
右辺の「num」の値は2となっているので
num = 1 + 2; となる。
numに1+2が代入されnumの値は3となります。

num++ はnumの値を返し、同時にnumの値を1増やすと考えるとよいかと思います。

投稿2021/12/11 11:33

Crimson_Tide

総合スコア509

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

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

hinata0812

2021/12/11 12:43

右辺のnum++は 左辺に代入と同時に1足されて2になっていると思うのですが、結局その2は左辺に1に代入した時点で2にはなったが0になったということでしょうか?
Crimson_Tide

2021/12/11 13:28

> 右辺のnum++は 左辺に代入と同時に1足されて2になっている num++は 2にはなりません。 num++はあくまで1で、2になるのはnumの値です。 まず右辺だけ考えてください。 num++ は1 そして右辺には他にnumはないですが、numの値は2になっています。 その2になったnumを参照することはここではありません。 2にはなったけど、その2は使われることはありません。 その上で 左辺に代入されるのはnum++の1です。
Crimson_Tide

2021/12/11 13:39

あくまでイメージですが、以下のような流れと同じことです。 int num = 1; b= num++; // b の値は1 numの値は+1されて2 System.out.println("num:" + num); //num:2が表示されます num = b; //1が代入されるのでnumの値が1になる
hinata0812

2021/12/11 14:01

度々の回答ありがとうございました。理解できましたありがとうございました!
Crimson_Tide

2021/12/11 14:02

>結局その2は左辺に1に代入した時点で2にはなったが0になったということでしょうか? numが2になったのは、左辺のnumに 1 が代入される前です。 左辺において num++ とは何を表すか? 答えはnum++ を評価しようとする時点のnumの値1です。 なので頭の中で num++を1に置き換えてください。 同時にnumの値が1増えて2になるという処理がされています。 変数numは2になっていますが、左辺は 1 しか残っていません。そこにnum変数はもうありません。 そして改めて式全体をみると num = 1;となるので、numの値に1が代入されます。
guest

0

「右辺を評価する」時にインクリメントがすでに終わっており、一旦numが2になります。
その後、「代入する」ときにnumに1が代入されます。

投稿2021/12/11 11:21

swordone

総合スコア20651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問