• 締切済み

while(!b) の使い方について

こんにちは。ある書籍のサンプルコードの一部に、 boolean b=false; while(!b){ b=IsPrime(++current); } といった箇所があったのですが、このwhile文のループ条件がよくわかりません。IsPrime()の返す値がfalseでない間、つまりbがtrueである間、ループを繰り返すように見えましたが、実際はIsPrime()がtrueを返したとき、ループから抜けていました。 IsPrime()の返す値が逆になったときループを抜けるとか、いろいろ考えてみましたがどうもしっくりしませんしよくわかりませんでしたので、どなたがご説明の方よろしくお願いします。

みんなの回答

回答No.5

>アドバイスありがとうございます。最後にどうしてもしっくりこない事があるのですが、最初にboolean b=false;としているのに!bでどうしてwhile文の条件は、while(b==true)にならないのかが不思議で仕方ありません。最初のboolean b=false;はただ初期化しているだけなのかと思い、boolean b=true;にしてみたところ、コンパイルは通るものの実行エラーになりました。もしよろしければこの辺のご説明の方よろしくお願いします。 いや、エラーにはなりませんよ。 whileのブロックの中のコードが実行されないだけです。 エラーが出ているとしたらこの部分以外でしょう。 何度も説明されていますがwhile(!b)というのは b = false の間実行するということです。

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.4

>while(!b) 「!b の結果がtrue で有る間は」 ですよ。よって同義なのは → while(!b == true) → while( b != true) → while( b == false) b= true から始めたら、while内は一回も実行されません あと、代入と比較をごっちゃにしないように。 ま、私も == をうかつに = としてバグを何度作ったことか(;_;泣).

回答No.3

あんまりいい例じゃなかったですね。 出力後に判定して、その後カウントを進めているのでこうなってしまいます。 (実際カウントで何か処理をする場合は while( count < 3 ) とかでしょうね・・・こうすれば4回目が実行されない)

ossu
質問者

補足

アドバイスありがとうございます。最後にどうしてもしっくりこない事があるのですが、最初にboolean b=false;としているのに!bでどうしてwhile文の条件は、while(b==true)にならないのかが不思議で仕方ありません。最初のboolean b=false;はただ初期化しているだけなのかと思い、boolean b=true;にしてみたところ、コンパイルは通るものの実行エラーになりました。もしよろしければこの辺のご説明の方よろしくお願いします。

回答No.2

boolean b=false; while(!b){ //trueかfalseか出力 System.out.println(b); b=IsPrime(++current); } としますと、 true → ありえない false false false false false true のような感じで出力されてループを抜けています。 最初に System.out.println(b); する時点ではb=falseなのにtrueが出力されることはありえないです。 さらに、最後のtrue出力もありえません。 なぜならb=trueになった次のループは実行されないからです。 勘違いではないでしょうか? isPrimeがどんな処理なのかわからないので当方にて以下のサンプルコードを作成し、実行しましたが。 boolean b=false; int count = 0; while(!b){ //trueかfalseか出力 System.out.println(b); if ( count > 3 ){ b = true; } count++; } false false false false false と5回falseが出力され終了しました。 1.条件なしで → false 2.count(1) > 3 → false 3.count(2) > 3 → false 4.count(3) > 3 → false 5.count(4) > 3 → false

ossu
質問者

お礼

ありがとうございます。おっしゃられた通り勘違いでした。 すべてfalseで出力されました。

  • andy_kun
  • ベストアンサー率23% (64/274)
回答No.1

whileは式が真の間ループします。 通常真と偽は #define TRUE  1 #define FALSE 0 と定義されています。(慣習で記号定数は大文字で記述します) 単項の否定演算子は非ゼロ(つまり真)の被演算数を0にし、ゼロ(つまり偽)の被演算数を1にします。 これらの事をを踏まえてサンプルコードを見ると while(!b)はbが偽の間ループすることとなり、IsPrimeが真を返したときにループを抜けることになるのです。 また、while(!b)とwhile(b == FALSE)とは同じこととなり、どちらを使うかは好みですね。

ossu
質問者

お礼

ありがとうございます。最初にboolean b=false;とあったので、てっきりwhile(b==true)になると思っておりましたがそうではなかったんですね。

ossu
質問者

補足

すいません、やっぱりよくわかりませんでした。 最初にboolean b=false;とあるので、 while(!b)で、while(b==true)になるのではないかと思うのですが。 実際、 boolean b=false; while(!b){ //trueかfalseか出力 System.out.println(b); b=IsPrime(++current); } としますと、 true false false false false false true のような感じで出力されてループを抜けています。 なぜ最初にbの値がfalseにも関わらず、 !bで、while文の条件が、b==falseのままなのか、その辺の事がわからないのですが。 もしよろしければ説明の方、よろしくお願いします。

関連するQ&A