• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:変数booleanの扱い方)

変数booleanの扱い方

このQ&Aのポイント
  • 変数booleanの扱い方について詳しく説明します。
  • コード上でboolean型の変数を初期化する際に、0を代入するとエラーが発生します。また、trueとfalseを入れ換えることもできません。
  • コードの中でboolean型の変数を使用し、条件によってtrueとfalseを切り替える方法を説明します。

質問者が選んだベストアンサー

  • ベストアンサー
  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.2

>boolean bl = false; は「やはり!」と納得なのですが、 >では、どういうときにfalseでどういうときにtrue boolean型という考え方はわかりますか? boolean型とは電気のスイッチみたいなものです。 (1)TRUE状態=ONの状態=「真」の状態     □□□□□□       TRUE□■   □FALSE     □□□□□□ (2)FALSE状態=OFFの状態=「偽」の状態     □□□□□□       TRUE□   ■□FALSE     □□□□□□ があります。 ここまではよろしいですね。 では中身を分解して行きましょう! ★ 実行部分の解析 ::::::::::::::::::::::::::::::::::::::::::::: if(bl == false){ System.out.print('*'); bl = true; } else{ System.out.print('-'); bl = false; } ::::::::::::::::::::::::::::::::::::::::::::: これは、blが「偽 = スイッチ(2)の状態」 ならば、 「*」を出力するのですね。 そのあとで、スイッチを(1)の状態にしています。 一方で、blが「真 = スイッチ(1)の状態」 ならば、 「-」を出力するのですね。 そのあとで、スイッチを(2)の状態にしています。 if ( ) {(あ)} else {(い)} 文ですから、 (あ)か(い)かどちかのみ実行されます。 「どちらかのみ」実行されるということろの理解はよろしいですか? (あ)でスイッチを切り替えたから、ついでのように(い)も実行するという ことは決してありません。ここの理解は大切です。 ※まとめ・・・ この内容は、スイッチの状態をTRUEかFALSEかを判定して、 FALSEなら「*」を出力し、TRUEなら「-」を出力する。 そして、スイッチの状態を「反転」している。 これを、以下「スイッチ(*)(-)処理」と呼ぶととする。 ★内側のFOR文を理解する 先ほどの内容と合わせると、内側のFOR文は次のように書くことが出来ます。 ::::::::::::::::::::::::::::::::::::::::::::: for(int j=0; j<5; j++) 「スイッチ(*)(-)処理」 } ::::::::::::::::::::::::::::::::::::::::::::: これは単に「スイッチ(*)(-)処理」を5回繰り返しているだけですね。 では5回繰り返すとどのようになるか考えてみましょう。 例えば、今、スイッチをOFF(=FALSE)の状態であるとして、 「スイッチ(*)(-)処理」は1回目は、 * が出力されて、スイッチが反転します。 スイッチが反転しましたから、スイッチがON(=TRUE)の状態 になりました。ですから、2回目は - が出力されます。そしてまたスイッチが反転します。 このように5回実行するわけですから、 *-*-* となることがわかります。 さて、ここで注意するべきことは、5回実行した後、 スイッチの状態はどうなっているのでしょう? はじめは、スイッチがOFF(=FALSE)の状態 でしたから、 偽から→(1回目実行→真へ)→(2回目実行→偽へ)→(3回目の実行→真へ)→ (4回目の実行→偽へ)→(5回目の実行→真へ) となります。 家の電気のスイッチボタンで考えるとわかりますね! はじめに消えている電気を5回スイッチを切り替えると、確かに電気がつきます。 又、一方で、始めに電気がついている状態で5回スイッチを切り替えると、電気が消えますね! ですから・・・ ※まとめ 内側のFOR文は5回「スイッチ(*)(-)処理」を実行する。 スイッチの状態は、5回実行する「前」と5回実行した「後」とでは、スイッチの状態は反転する。 とわかります。 これを、以下「スイッチ内側(*)(-)5回処理」と呼ぶととする。 ★外側のFOR文を理解する 先ほどの内容と合わせると、外側のFOR文は次のように書くことが出来ます。 ::::::::::::::::::::::::::::::::::::::::::::: for(int i=0; i<5; i++) 「スイッチ内側(*)(-)5回処理」 } ::::::::::::::::::::::::::::::::::::::::::::: ですから、「スイッチ内側(*)(-)5回処理」の処理全体を1回と考えて、 これを5回行うわけですね。 確か、はじめにスイッチを偽の状態からスタートしたとして、 「スイッチ内側(*)(-)5回処理」全体を1回実行すると、 *-*-* が出力されて、さらにスイッチが反転するのでしたね。 ということは、2回目の実行では、スイッチが反転して 真の状態からスタートしますから、 -*-*- が出力されて、またスイッチが反転しすね。 このようなことを5回実行するわけですね。 1回目 *-*-* 2回目 -*-*- 3回目 *-*-* 4回目 -*-*- 5回目 *-*-* これが全部ひとつにつながって出力されますから、出力結果は *-*-*-*-*-*-*-*-*-*-*-*-* となります。 今は、始めスイッチが「偽」の状態を前提としましたが、 始め、スイッチを「真」の状態にしておくと、 -*-*-*-*-*-*-*-*-*-*-*-*- となります。わかりますでしょうか? ★最後に・・・(ちょっと応用) では、よりスマートに書くことは出来ないのでしょうか? こんかいはスイッチを切りかえると言うことでしたから、もっとスマートに出来そうです。 ::::::::::::::::::::::::::::::::::::::::::::: boolean bl = 0; for(int i=0; i<5; i++) for(int j=0; j<5; j++) if(bl == false){ System.out.print('*'); bl = true; } else{ System.out.print('-'); bl = false; } } ::::::::::::::::::::::::::::::::::::::::::::: ここで、スイッチを切りかえるのがいまひとつへたくそに思えます。 そこで、次のようにしてみましょう! boolean bl=false; for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { System.out.print(bl ? '-' : '*'); // blが真ならば-を、偽ならば*を出力する bl = !bl; // スイッチblの状態を反転する。!blとは bl = !bl で 「blでない」値をblに代入するので反転することがわかる。 } } 以上、kokucho81の講座で~した☆

koujin
質問者

お礼

本当にありがとうございました!!すっごく良くわかりました。読んでて分かったとき思わず、手をたたいて喜んじゃいました(^^) まだまだ、基本すら分かってないけど、いつかkoukucho81さんのようにスマートなコードが書けるようにがんばります!!本当に分かりやすい回答ありがとうございました。

その他の回答 (1)

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.1

ああ、多分C言語か何かその辺をおやりになったことがあるのでしょう。 boolean bl = 0; これはダメです。 C/C++ では 真:偽 → 0意外:0 と対応していますが、 Java では 真:偽 → true:false であって0意外:0とは純粋には対応していないです。 だから boolean bl = false; としなければならないです。 >trueとfalseを入れ換えているのがわかりません。 boolean bl を一種のスイッチと見たてて、 * を表示したらスイッチをONにして、次にループでは - を表示する。 - を表示したらスイッチをOFFにして、次のループでは * を表示する。 という具合です。 あと、全体として、次のようなコードにするとふるまいが良くわかると思います。 ソース名a.java public class a { public static void main(String args[]) { boolean bl=false; for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { if(bl == false){ System.out.print('*'); bl = true; } else{ System.out.print('-'); bl = false; } } System.out.println(" #"+i); } } }

koujin
質問者

補足

すごい分かりやすい答えありがとうございました。 ただ、私は実は全くの初心者で本を見ながら独学で 勉強しているのでCも全く知りません・・。 そこで、またずうずうしくもお聞きしますが、 boolean bl = false; は「やはり!」と納得なのですが、では、どういうときにfalseでどういうときにtrue なのかがわかりません。iを一つ数えるたびにjは五つ数えますよね?数字が0・0でfalse? お恥ずかしいのですが、よろしくお願いします。 また、書いていただいたコードを早速実行したところ、 なんとなくつかめそうな感じがしました。 ありがとうございました。