• 締切済み

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

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

  • ossu
  • お礼率75% (36/48)
  • Java
  • 回答数5
  • ありがとう数3

みんなの回答

回答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

  • [Java] while(true)の意味

    Javaの参考書で、下記の文がありました。 ... while(true){ 処理 } ... whileの条件式で“true”と書いてありますが、trueではなくなる(falseになる)のは どのような処理が実行された時でしょうか? 出来れば具体的なコードでご教示頂けると助かります。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • javaのwhile文について

    すいません再び質問です。 じゃんけんの問題です(0がグー、2がチョキ、5がパー、指の本数です) public class Sample9_2 { public static void main(String[] args) { int[] a = { 0, 5, 5, 0 }; int[] b = { 2, 5, 2, 2, 5, 0, }; int[] c = { 5, 0, 2, 0, 2, 5, 2 }; int index = 0; boolean 同じ手を出していない = true; while (同じ手を出していない) { if (a[index % a.length] == b[index % b.length] && b[index % b.length] == c[index % c.length]) { 同じ手を出していない = false; } else { index++; } } System.out.println((index + 1) + "回目で全員が同じ手を出しました"); } } 【実行結果】 50回目で全員が同じ手を出しました boolean 同じ手をだしていない = true と 同じ手を出していない = false の意味がわかりません; すいませんが回答お願いします。

  • while構文について質問

    以下は、ソースコードの一部です。それを見た上で私の質問に答えてください。 int i=0; while(true) System.out.println(i); i++ 質問:何故、whileの反復条件に「true」を書くと、無限ループになるのですか? その理由は、「while構文は、括弧の中の反復条件の判定の結果がtrueなら、処理を行うので、括弧の中にtrueを書くと、反復条件はtrueのまま変わらないので、その判定結果はtrueと判断されつづけ無限ループする」こういうことでしょうか?

    • ベストアンサー
    • Java
  • while構文について質問

    以下は、ソースコードの一部です。それを見た上で私の質問に答えてください。 int i=0; while(true) System.out.println(i); i++ 質問:何故、whileの反復条件に「true」を書くと、無限ループになるのですか? 私の仮説では、trueは「条件を満たす」という意味だから、よって反復条件を満たし続けるので、永遠にiを表示し続けるということでしょうか?

    • ベストアンサー
    • Java
  • Boolean型変数の値を反転する方法

    ご存知の方教えて頂けますか? Boolean型変数の値が True なら False,False なら True に変換したいのですが、現在次のようにcodeを書き、希望した値になります。 Dim bool As Boolean 中略 bool = bool - True このcodeは正しいのでしょうか? 他に ”正しい方法”があるのでしょうか? スミマセン!よろしくお願いします。

  • 多重ループの抜け方

    例えば2重ループで、内側のループと外側のループも抜けたいとき、 while(true){  boolean flag = false;  …  while(true){   if(/* ある条件を満たした時 */) {    flag = true;    break;   }  }  if(flag){ break; } } としているのですが、このループが3段、4段になるときもこのような方法しかないのでしょうか?C言語のgotoみたいなことはできないですよね・・? (goto自体使わない方がいいと言われていますが・・)

    • ベストアンサー
    • Java
  • このwhile文、ずっと回っているのでしょうか?(iアプリ・Java)

    このwhile文、ずっと回っているのでしょうか?(iアプリ・Java) //trueを入れたwhile文 while(true){  if(keyEvent == Display.KEY_1){   //ボタン「1」をプッシュされた時の処理(内容は文字列出力など、適当に。)  }  //keyEventを初期化。(少なくとも、「1」ではない数字に)  keyEvent = -555; } //キーイベント(※iアプリ)の処理  public void processEvent(int type, int param) {  if (type==Display.KEY_PRESSED_EVENT) keyEvent=param; } このような記述を書籍で見掛けました。 動作としては、問題なく動いているのですが、 これは、キーイベント待ちの無限ループという感じなのでしょうか? ループしている間、常に回っていて、ハードウェアに仕事をさせている(電力消費)ということなのでしょうか?

    • ベストアンサー
    • Java
  • boolean型の戻り値は可能か

     今日は、Cの初心者です。  比較した値をboolean型でとりたいのですが、色々と調べたのですが、Cではboolean型は定義されてないのでしょうか。  if(a>b); printf("true\n");というような書き方しか出来ないのでしょうか。  例えば   if(a>b);   printf("%●\n"、(a>b));  という書き方で直接"true"とか"false"を取らすとか、  "0"、"1"、"-1"の戻り値をとらせることは出来ないのでしょうか。

  • Waitメソッド なぜブール型?

    エクセルvbaを勉強中の者なのですが Sub Sample() Application.Wait (Now + TimeValue("00:00:01")) End Sub このコードのWait メソッドのヘルプを見たのですが、 戻り値がブール型 (Boolean)になっています。 そもそもメソッドなのに、ブール型 ってあり得るのでしょうか? ブール型って、trueかFalseが返るってことなんですよね? 上記コードは、どうやればtrueかFalseが返るのでしょうか?

  • do-while文について

    参考書を読んでいて分からないところが有りました。 「配列aの値を先頭から見ていき、その値が-1になるま配列bにコピーしていく。そのとき-1という値もコピーする。という処理をするものです。-1という値もコピーするため、このループは最低1回は実行されることになります。 i=0; do{ b[i]=a[i]; }while(b[i++]!=-1); 」 この場合、a[0]が-1のときにはb[0]に-1がコピーされるかもしれませんが、そうでない場合は「そのとき-1という値もコピーする。」というのは出来ないと思うのですが、どなたかご教授宜しくお願いします。