2017-02-14 33 views
-2

非常に似ているにもかかわらず、一方のループはなぜ動作しているのか不思議です。Java while whileループ式

dmCylループ正の整数が入力されるまでループしたいと思います。これは動作しないループです。しかし、ユーザがintを入力するまでループするhgtCylループが機能します。 (dmCyl < 0)ループは完全に無視されているようです。何故ですか?

また、hgtCyl = scnr.nextInt();を中身(after scnr.next())またはその外側に入れても、動作するループがあります。場所の変更は何ですか?

ありがとうございます!

EDIT: while whileループを設定すると、問題が解決します。
もう一度おねがいします!
ソリューション:

dmCyl = scnr.nextInt(); 

    do{ 
     System.out.print("please insert positive int"); 
     dmCyl = scnr.nextInt(); 
    }while (dmCyl < 0); 

オリジナルコード:

int dmCyl = 0; 
int hgtCyl = 0; 

Scanner scnr = new Scanner(System.in); 

while (dmCyl < 0) { 
    System.out.print("Please enter an integer"); 
    scnr.next(); 
} 

dmCyl = scnr.nextInt(); 

そして働くループ:

while (!scnr.hasNextInt()){ 
    System.out.print("Please enter an integer"); 
    scnr.next(); 
} 

hgtCyl = scnr.nextInt(); 
+3

原則として、0は決して0より小さくありません。したがって、最初のループがすぐに終了します。 – shmosel

+1

またはループに入ったときに 'dmCyl'の値は何ですか(最初に' dmCyl <0'をテストする) –

+0

'(dmCyl <0)'は '0 <0'です。 –

答えて

4

使用していますか/ここ

do { 
    System.out.print("Please enter an integer"); 
    dmCyl = scnr.nextInt(); 
} while (dmCyl < 0); 
1

をあなたは最初に、あなたが行くだけにループを言っているゼロにdmCylを設定していますそれはゼロよりも小さい。その時点でループを開始するので、すでに条件を満たしており、ループに入ることはありません。代わりにdmCylを-1に設定してください。

1

はあなたの文dmCyl < 0がfalseであるので..あなたはこのような何かを追加しようとする必要があり、dmCyl = 0初期化:while (dmcyl <= 0)

1

whileの公式記述からの一部しばらくJava Language Specification 14.12、私によって表示された関連テキスト(太字):

while文は、最初に式を評価することによって実行されます。結果がブール型の場合、アンボックス変換(§5.1.8)の影響を受けます。

何らかの理由でExpressionまたはそれに続くボックス化解除変換(ある場合)の評価が突然完了すると、同じ理由でwhile文が突然終了します。

そうでなければ、実行は、得られた値に基づいて選択することによって継続:

  • 値がtrueの場合、含まれるステートメントが実行されます。そして、選択肢があります:

    • Statementの実行が正常に完了した場合、全体の文が式を再評価することにより始め、再び実行している間。

    • ステートメントの実行が突然完了した場合は、14.12.1項を参照してください。

式の(おそらく箱なし)値がfalseの場合、さらなる動作は起こらずwhile文は正常完了する。意味

、発現が初めてループコンテンツを実行前をチェックします。結果がfalseの場合、コンテンツは実行されず、ループは終了します。