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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

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

Q&A

解決済

4回答

1141閲覧

拡張for文の内部的な挙動について

sotakun_0219

総合スコア14

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

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

0グッド

0クリップ

投稿2017/08/08 08:33

編集2017/08/08 09:27

拡張for文では内部的にイテレーターを使用しているということは分かったのですが、具体的な記述を調査しても見付けることができませんでした。
またeclipseのデバックモードで実行してみたのですがわかりませんでした。
もし知ってる方がいらっしゃれば、どのような挙動をしているのか教えてください。

目的が不明との指摘がございましたので修正致します。
Javaを深く理解すると言う目的で質問させていただきました。

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

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

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

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

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

PineMatsu

2017/08/08 09:03

内部処理を知って何をしたいのでしょうか?技術的な興味?便利に使うだけではなだめなの?
sotakun_0219

2017/08/08 09:24

主にJavaを深く学ぶ為に質問させていただきました。あるものをどう行った処理がなされているかを理解せずに利用するのは、私個人としてはあまり好みません。出来るだけ理解して使うことが本当の理解に繋がると考えた為、質問させていただいました。この質問が場を乱してしまっていたのであれば謝罪します。
guest

回答4

0

Java言語仕様(Java Language Specification)に明記されています:

If the type of Expression is a subtype of Iterable, then the translation is as follows.

If the type of Expression is a subtype of Iterable<X> for some type argument X, then let I be the type java.util.Iterator<X>; otherwise, let I be the raw type java.util.Iterator.

The enhanced for statement is equivalent to a basic for statement of the form:

Java

1for (I #i = Expression.iterator(); #i.hasNext(); ) { 2 {VariableModifier} TargetType Identifier = (TargetType) #i.next(); 3 Statement 4}

#i is an automatically generated identifier that is distinct from any other identifiers (automatically generated or otherwise) that are in scope (§6.3) at the point where the enhanced for statement occurs.

すこし(かなり?)読み辛いですが、拡張for文(enhanced for statement)の動きを、等価な通常のfor文にて定義しています。Javaコンパイラはこの仕様にしたがってコンパイルを行います。

投稿2017/08/08 10:02

yohhoy

総合スコア6189

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

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

sotakun_0219

2017/08/08 10:09

回答ありがとうございます! 抜粋していただきありがとうございます! 頑張って解読します笑
guest

0

Javaの言語仕様を確認してください。

The Java® Language Specification - Java SE 8 Edition#14.14.2. The enhanced for statement

Iterableなオブジェクトの場合と配列型(T[])の場合、それぞれがどのように解釈されるか書いてあります。

さらにVMの動きまで追いたい場合は The Java® Virtual Machine Specification - Java SE 8 Edition を参考にしてください。(そこまでは、私も追ったことが無いので、よくわらないです)

投稿2017/08/08 09:48

raccy

総合スコア21733

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

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

sotakun_0219

2017/08/08 10:02

回答ありがとうございます! VMの動きもすごく興味がありますので、拝見させていただきます!
guest

0

ベストアンサー

ざっくり、こんな感じです。

Javaの拡張

Java SE 5.0 での拡張機能
拡張された for ループ - この新しい言語構造体により、コレクションや配列を反復する際の、イテレータおよびインデックス変数の煩雑さやエラー発生の可能性がなくなりました。(JSR 201)

JSR 201

現在のforループ構造は強力ですが、コレクションに対する反復には多少なりとも適していません。コレクションを反復する標準的なイディオムは多少冗長です。

コレクションと配列の繰り返し処理のために特別に設計され たforループの第2の形式を提案します。

この提案はコンパイラにのみ影響します。

というわけで、内部で使うというより、
もともとイテレータを使う際に簡単に利用できる文法を用意したという感じです。

あと、ご自分でやるほうがためになりますが、逆コンパイルとかの結果は、
こちらでも紹介されてますね。

投稿2017/08/08 09:42

編集2017/08/08 09:49
momon-ga

総合スコア4820

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

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

sotakun_0219

2017/08/08 09:57

ありがとうございます! 勉強になりました! 逆コンパイルも明日試してみます!
guest

0

目的が見えないので的確な回答になっているのか自信がないのですが、以下参考になれば幸いです。

以下の手順でコンパイラーがどのようなコードを生成しているか確認出来ると思います。

  1. 拡張for文を書いたクラスをコンパイルして、クラスファイルを生成します。
  2. クラスファイルを逆コンパイルして、逆コンパイルの生成結果を見る

投稿2017/08/08 08:47

YasuhiroMiyake

総合スコア1336

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

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

sotakun_0219

2017/08/08 09:03

回答ありがとうございます! Javaを深く学ぶ事を目的としているので、これを知ってどうにかすると言うことはありません。 今開発環境から離れてしまっているので、明日試させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問