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

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

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

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

Q&A

解決済

4回答

3293閲覧

Java言語においてのインクリメントの前置と後置の計算について

root_k_on_22222

総合スコア12

Java

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

2グッド

1クリップ

投稿2016/08/02 11:48

初めまして、root_k_on_22222と申します

インクリメントの計算で様々なサイトを見て調べたりしたのですが、分からない部分があって困っています

[使用しているJava総合開発環境]
・Eclipse
Version: Neon Release(4.6.0)
Build id:20160613-1800

「ソースコード(Java)」
public class test1 {

public static void main(String[] args) { int a = 2; int x; x = a++ * ++a; System.out.println(x); }

}

上記のソースコードを実行すると、コンソールに「8」と表示されます
しかし、何故「x = a++ * ++a」の計算結果が「8」となるのかがよく分かりません

何故「x = a++ * ++a」の計算結果が「8」となるのか、教えてください
お願いします

stereo_code, Mr_Roboto👍を押しています

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

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

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

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

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

guest

回答4

0

Noxの値aの値今回評価した部分評価結果次回評価する部分
0x = a++ * ++a02a++
1x = 2 * ++a03a++2++a
2x = __2 * __404++a42 * 4
3__x = __8042 * 48x = 8
4884x = 88

太字…評価結果に置き換わった部分および副作用で値が変わった部分 斜体…次に評価する式

なお、Javaの二項演算子は必ず左から右へ評価されますが、その規則を期待することは推奨されていません(つまり、今回の書き方は非推奨な書き方)。また、C/C++など他言語では必ずしもそうではありませんので、ご注意ください。
参考:
The Java® Language Specification - Chapter 15. Expressions#15.7. Evaluation Order
Java言語規定 式#15.7 評価順序

投稿2016/08/02 13:13

編集2016/08/02 13:23
raccy

総合スコア21735

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

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

root_k_on_22222

2016/08/02 13:48

丁寧な回答ありがとうございました とても参考になりました
guest

0

java

1int a = 2; 2x = a++ * ++a;

Java言語の場合、下記順序で計算が行われます。

  1. 左辺のa++を評価。変数aは2→3に更新され、部分式a++の結果は2となる(前置インクリメント)。
  2. 右辺の++aを評価。変数aは3→4に更新され、部分式++aの結果は4となる(後置インクリメント)。
  3. 上記の評価結果より2 * 4となり、その結果は8となる。
  4. 変数xに8を代入。

投稿2016/08/02 12:01

編集2016/08/02 12:36
yohhoy

総合スコア6191

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

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

root_k_on_22222

2016/08/02 12:23

回答ありがとうございます 疑問に思ったのですが、1の部分と2の部分に「部分式の結果」とありますが、部分式とは、どこからどこまでの範囲のことなのですか? 教えてください お願いします
yohhoy

2016/08/02 12:36

部分式だと曖昧だったので回答をUpdateしました。
root_k_on_22222

2016/08/02 13:49

丁寧な回答ありがとうございました とてもに参考になりました
guest

0

ベストアンサー

前置インクリメントは値を取り出す前に1を加算し、
後置インクリメントは値を取り出した後に1を加算します。

つまり以下の動作は、
先ず左辺で「a++」で初期値の2を取り出し、
その後に1を加算してaの値を3にし、
そして右辺の「++a」で先ず1を加算して4にしてから値を取り出すという動作となります。

よって最終的には「x = 2 * 4」として評価されます。

###追記
コメントを受け補足します。
誤解を与えてしまったかもしれませんが、
前置インクリメントと後置インクリメントでは、
どちらが優先して実行するというルールはありません。

あくまでコードの実行順に依存します。

複数行に分かれる場合

Java

1int a = 2; 2 3// コードは上から下に実行される 4a++; // こっちが先に動く 5++a; // こっちが後

同一行内の場合

Java

1int a = 2; 2 3// コードは原則、左から右へ評価する 4// 下記は前置インクリメントが先に動く 5int x = ++a * a++; // x = 9

投稿2016/08/02 12:03

編集2016/08/02 13:33
Panzer_vor

総合スコア1636

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

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

root_k_on_22222

2016/08/02 12:29

回答ありがとうございます 「後置インクリメントは演算後に1を加算します。」とありますが、後置インクリメントの演算後とは、具体的にどのようなものなのですか? 教えてください お願いします
Panzer_vor

2016/08/02 12:47 編集

評価的な意味で「演算」と使ってましたがこれは誤用ですね、すいません。表現改め直しました。
root_k_on_22222

2016/08/02 13:10

ということは、前置インクリメントと後置インクリメントがあった場合、後置インクリメントを優先して後置インクリメントの処理を行ってから、前置インクリメントの処理を行うということですか?
Panzer_vor

2016/08/02 13:20

それは誤解ですね。 例えば下記のようなケース。 「x = ++a * a++」(aの初期値は質問と同様2とします) このケースでは、 先ず左側で1加算後に値を取り出し、右側で値を取りてから1加算します。 結果「x = 3 * 3」となります。 どちらかのインクリメントが優先されるとかではなく、 コードの実行順で評価されます。 実行順については回答追記しときます。
root_k_on_22222

2016/08/02 13:28

プログラミングのコードは「左から右へ実行」されるので 今回の場合は「後置インクリメント」が実行されてから「前置インクリメント」が実行されたということですか?
Panzer_vor

2016/08/02 13:36

その認識で相違ないです。 コードが実行する順序に依存します。 試してはいませんが、括弧を含む計算式で試してみると面白いかもしれませんね。
root_k_on_22222

2016/08/02 13:46

なるほど、そういうことだったのですね 意味が分かってすっきりしました ありがとうございました
guest

0

x = 2++ * ++2
x = 2 * ++3
x = 2 * 4
x = 8

こんな感じだと思います、混乱してきました。

投稿2016/08/02 11:59

yona

総合スコア18155

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

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

root_k_on_22222

2016/08/02 12:19

回答ありがとうございます 「x = 2 * ++3」の部分について疑問に思ったのですが 何故、「++2」の部分が「++3」になっているのですか? あと、「2++」の後置インクリメントの計算は、いつ行われるのですか? 教えてください お願いいします
yona

2016/08/02 12:24

2++を評価すると2になり、評価後にインクリメントされるので3になります。
root_k_on_22222

2016/08/02 13:50

丁寧な回答ありがとうございました とても参考になりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問