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

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

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

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

Q&A

解決済

4回答

2198閲覧

この例文はどうしてループ終了するのでしょうか?

kidaer

総合スコア31

Java

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

0グッド

0クリップ

投稿2018/01/07 15:18

public class CommandLine{
public static void main(String[] args){
for(int i=0; i<args.length; i++){
System.out.println(args[i]);
}
}
}

iが0の時、args配列数が0。
0 < 0 で条件が不成立なのでループ入り。
System.out.println(args[i]);
最後にi++ でiは1になるという解釈をしています。

しかし、これだと最後に必ずi++が加算されるので、
args.lengthがiを上回る瞬間はなく永遠にループするのでは?と思いました。

どうしてこの例文はループ終了するのでしょうか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/01/07 15:22

実行できるものは実行しな
kidaer

2018/01/07 15:25

実行できるものを実行して正常に作動して不思議だったから質問しました。
退会済みユーザー

退会済みユーザー

2018/01/07 15:28

コマンドプロンプトから実行した場合、コマンドの入力待機に、エクリプスから実行した場合<終了>と出てませんでした? その状態はプログラムが正常終了している状態です
退会済みユーザー

退会済みユーザー

2018/01/07 15:30

>や<の意味が理解できないのは算数(不等号、等号 は小学校3年生の内容)と同じですけどね
kidaer

2018/01/07 15:49

あっ、すいません。収納されていてレスついてたことに気付かず……。そうではなくて、正常に終了しているからどういう仕組みになっているか理解したかったのです。初心者なもので。あまり喧嘩腰なレスは勘弁してください。
guest

回答4

0

mainメソッドの引数argsはコマンドライン引数と呼ばれ、Javaのプログラム実行時に渡す文字列です。
Windowsであればコマンドプロンプトに「java (クラス名)」と入力した後続けて入力する文字が空白区切りで配列の要素となり、mainメソッドに渡されます。
これがない場合、argsは要素数0の配列、つまり

java

1args = new String[0];

としたのと同じ状態となります。この状態ではargs.lengthはもちろん0になります。
これ自体に、iがどうとかは一切関係がありません。

そのような状況を仮定して、改めてコードを見てみましょう。

java

1for(int i=0; i<args.length; i++){ 2 System.out.println(args[i]); 3}

まず初期化文でint型の変数iを0に初期化します。次に継続条件であるi < args.lengthをチェックします。
先ほど確認した通り、args.lengthは0です。現在iは0ですから、この継続条件の式は
0 < 0
を意味していることになります。これは偽、つまりfalseになりますから、継続条件が成立せず、ループを抜けます。
ループの中身も、更新文であるi++も一度も実行されることはありません。

投稿2018/01/07 18:29

swordone

総合スコア20651

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

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

kidaer

2018/01/07 19:23

申し訳ありません。わかりやすく説明していただき、ようやく質問の内容と実際の現状がすれ違っていることに気付けました。 実行はコマンドプロントでしているのですが、入力時に java CommandLine a i u など、上記の内容を記入しています。 args.length;の中身を見ることができたのですが、 上記の内容の場合だと「3」になり配列の総数による普通のループだったことがわかりました。 本当に申し訳ありません。 これ以外の方法で実行できなかったので、そういうもんなんだなと思っており、実行方法を書き忘れた他、いただいたアドバイスを理解するのにも時間がかかってしまいました。 args.lengthが0で継続条件が成立しなかった為に、記入なしだとまともに実行しなかったんですね。 回答ありがとうございました!
guest

0

iが0の時、args配列数が0。

なぜ?コマンドライン引数の与え方に依存するので、『iがxxのとき』と考える必要はありません。

0 < 0 で条件が不成立なのでループ入り。

ループの条件部は、ループを続ける条件です。
コマンドライン引数が与えられないときは、そもそもループに突入しません。

投稿2018/01/07 15:22

編集2018/01/07 15:23
LouiS0616

総合スコア35660

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

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

kidaer

2018/01/07 15:37

回答ありがとうございます。 つまり、argsに中身がない時は自動的に終了するので、argsの数字を考える必要はないということでしょうか? つまり形式としては0<argsで数値を比べる形にはなっているけど、実際にはfalseかtrueの形になっている……という感じで解釈しました
guest

0

□回答1
質問文は基本forステートメント(リンク先は英語です)
基本forステートメントは以下のようになっています。

Java

1for(初期化式;ループの継続条件式;インクリメント式){ 2 ステートメント; 3}

1,初期化式
2,ループ継続条件式の評価
3,ステートメント
4,インクリメント式
5,ループ継続条件式の評価
6,ステートメント
7,インクリメント式
・・以下5~7の繰り返しです。

の順に評価されます。
args配列数(args.length)が0の時は、上記2のループ継続条件式の評価がfalseなため、3以降の処理を行いません。

□回答2
極論ですが、基本forステートメントは以下のソースコードのシンタックスシュガーです。

Java

1{ 2 初期化式; 3 while(ループの継続条件式) { 4 ステートメント; 5 インクリメント式; 6 } 7}

投稿2018/01/07 17:44

編集2018/01/07 17:58
umyu

総合スコア5846

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

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

kidaer

2018/01/07 19:26

たくさん回答をいただいたおかげで、質問の内容と現状がすれ違っていることに気付けました。申し訳ありません! 専門用語の方はまだ飲み込めないところがありますが、いろいろ覗いてみてわかるようになっていきたいと思います。 回答ありがとうございました!
guest

0

ベストアンサー

forの2つ目に書くのは、ループ継続条件です。偽ならループを抜けます(ループに入りません)。

投稿2018/01/07 15:23

otn

総合スコア84505

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

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

kidaer

2018/01/07 15:27

では<args.length;の初期数値が1ということなのでしょうか? わかりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問