論理演算について質問

このQ&Aのポイント
  • 論理演算に関する質問について説明します。
  • 2つの論理式について、trueになるプロセスについての認識について説明します。
  • さらに、論理式の演算結果を計算する場合についても説明します。
回答を見る
  • ベストアンサー

論理演算について質問

最初に、前回同じ質問に答えてくださった方へ、いろいろな人から僕の仮説のコンセンサスを得たいので、再度同じ質問しますね。 int a=1,b=0,c=0のとき a==1 && b==0 | (a==1 && b==0) a==1 && b==0 &&c==0 && b==0 の2つの論理式あったとします 質問1:&&や||は、その間にある2つの関係式や2つの関係式の論理演算の結果同士などを論理演算するものだと思います。この認識で正しいですか? 質問2:上記の論理式の後者a==1 && b==0 &&c==0 && b==0について、trueになるプロセスの認識は以下で正しいですか? a==1 && b==0 はtrue       ↓  左から2番目の&&は、左の論理式(a==1 && b==0)の演算結果であるtrueと関係式c==0を論理演算(つまり、論理演算の結果trueと関係式の2つを演算)、、結果true ↓ 左から3番目の&&は、左の論理式(a==1 && b==0 &&c==0 )の演算結果であるtrueと右の関係式b==0を論理演算(つまり、論理演算の結果trueと関係式の2つを演算)、結果true 質問3:前者の論理式、a==1 && b==0 | (a==1 && b==0)について、trueになるプロセスの認識は以下で正しいですか? (a==1 && b==0)はtrue      ↓ a==1 && b==0 はtrue      ↓ |は、右の論理式((a==1 && b==0))の演算の結果trueと左の論理式(a==1 && b==0)の演算結果trueを計算し(つまり論理演算の結果同士であるtrue2つを演算)、結果true

  • Java
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

> &&や||は、その両側にある2つの関係式を論理演算するってことなんですね^^ この表現は一般論としては少々不正確です。 &&や||は、その両側にある2つの“boolean型の式”に対して論理演算を行います。 ==や>=を使った関係式はもちろんboolean型の式ですが、それ以外にもboolean型の式はいろいろあります。 > 両側の関係式を一気評価はせずに一つ一つ評価していくんですか? 「一気」というのは「同時に」とか「並列に」という意味でしょうか。 Javaでは式の評価順序は仕様で厳密に決まっていて、たとえCPUが複数あっても&&の左にある式と右にある式を同時に評価することはありません。 > いろいろな人から僕の仮説のコンセンサスを得たいので 何が正しいのかを確かめるのが難しい分野 (天文学とか量子力学とか) とは違って、プログラミング言語は人間が規則を決めて作ったものですから、“仮説”を立ててその内容が正しいか否かあれこれ悩んだりコンセンサスを得たりする必要はありません。 言語仕様書を納得行くまで読んで理解してください。

wantanton
質問者

お礼

ありがとうございます! 納得するまで言語仕様書読みます!

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

> 質問1:&&や||は、その間にある2つの関係式や2つの関係式の論理演算の結果同士などを論理演算するものだと思います。この認識で正しいですか? 「間」じゃ無くて「両側」であること以外は正しいです。 > 質問2:上記の論理式の後者a==1 && b==0 &&c==0 && b==0について、trueになるプロセスの認識は以下で正しいですか? ちょっと違うかなぁ?  a==1 はtrue   ↓  a==1 がtrue だから、最初の && はその後ろの b==0 を評価する。結果は true なので、a==1 && b==0 は true   ↓  a==1 && b==0 が true だから、左から2番目の && はその後ろの c==0 を評価する。結果は true なので、a==1 && b==0 && c==0 は true   ↓  a==1 && b==0 && c==0 が true だから、左から3番目の && はその後ろの b==0 を を評価する。結果は true なので、a==1 && b==0 && c==0 && b==0 は true という認識のほうがあっているはずです。 > 質問3:前者の論理式、a==1 && b==0 || (a==1 && b==0)について、trueになるプロセスの認識は以下で正しいですか? 間違っています。処理の流れとしては、  最初のa==1 はtrue   ↓  a==1 がtrue だから、最初の && はその後ろの b==0 を評価する。結果は true なので、a==1 && b==0 は true   ↓  a==1 && b==0 がtrue だから、|| はその評価結果が true であるとし、その後の式の評価処理を「行わない」。 となります。 つまり、括弧の中の処理は行われません。

wantanton
質問者

補足

以下の内容でお礼します。よろしいですか? 丁重なご回答ありがとうございます^^ &&や||は、その両側にある2つの関係式を論理演算するってことなんですね^^ また追加で質問なのですが、両側の関係式を一気評価はせずに一つ一つ評価していくんですか?

関連するQ&A

  • 論理演算について質問

    int a=1,b=0,c=0のとき a==1 && b==0 || (a==1 && b==0) a==1 && b==0 &&c==0 && b==0 の2つの論理式あったとします 質問1:&&や||は、その間にある2つの関係式や2つの関係式の論理演算の結果同士などを論理演算するものだと思います。この認識で正しいですか? 質問2:上記の論理式の後者a==1 && b==0 &&c==0 && b==0について、trueになるプロセスの認識は以下で正しいですか? a==1 && b==0 はtrue       ↓  左から2番目の&&は、左の論理式(a==1 && b==0)の演算結果であるtrueと関係式c==0を論理演算(つまり、論理演算の結果trueと関係式の2つを演算)、、結果true ↓ 左から3番目の&&は、左の論理式(a==1 && b==0 &&c==0 )の演算結果であるtrueと右の関係式b==0を論理演算(つまり、論理演算の結果trueと関係式の2つを演算)、結果true 質問3:上記前者の論理式a==1 && b==0 || (a==1 && b==0)について、trueになるプロセスの認識は以下で正しいですか? (a==1 && b==0)はtrue      ↓ a==1 && b==0 はtrue      ↓ ||は、右の論理式((a==1 && b==0))の演算の結果trueと左の論理式(a==1 && b==0)の演算結果trueを計算し(つまり論理演算の結果同士であるtrue2つを演算)、結果true

    • ベストアンサー
    • Java
  • 論理演算について質問

    int a=1,b=0,c=0のとき a==1 && b==0 || (a==1 && b==0) の論理式あったとします 質問1:&&や||の論理演算子について、その『両側』にある2つの関係式を「1つ1つ評価」することにより論理演算する。この認識で正しいですか? 質問2:論理式 a==1 && b==0 || (a==1 && b==0)について、trueになるプロセスの認識は以下で正しいですか? (a==1 && b==0)のa==1を評価しtrue、次にb==0を評価しtrue。 よってこの論理式はtrue      ↓ a==1 && b==0 のa==1 を評価しtrue、b==0 を評価しtrue。 よってこの論理式はtrue      ↓ ||は、右の論理式((a==1 && b==0))がtrueで左の論理式(a==1 && b==0 )もtrueだから、論理式全体はtrueで確定しているので、評価を行わない。

    • ベストアンサー
    • Java
  • 論理演算子の関係式を結ぶ個数について質問

    int a=1,b=0,c=0のとき a==0 && (b==0 || c==0) a==0 && b==0 || c==0 の2つの論理式あったとします 質問1:前者の論理式の論理演算子である&&は、a==0と(b==0 || c==0)をつないでるイメージですか? 質問2:後者のa==0 && b==0 || c==0の論理式の||は、a==0 && b==0とc==0をつないでるイメージですか? 質問3:論理演算子は、その論理演算子からみて左方向にある関係式全てと右にある 関係式1つを結ぶものですか?ただし、()の中に複数の関係式がある場合、その複数の関係式を1括りにしていい。(例えば質問1の前者の例)

    • ベストアンサー
    • Java
  • 論理演算について質問

    何度もすみません。 また質問します。これで最後にしたい、、 質問1:&&や||等の論理演算子は、その両側にある2つの“boolean型の式(関係式等)”に対して論理演算を行う。 評価は、両側の式に対して並列に行うのではなく、1つづつ行って行く。 因みに、||は「論理式」を論理演算するこどができる。例えば、 int a=1,b=0,c=0のとき a==1 && b==3 || a==1 && b==0 の論理式があったとします。 この論理式の||は、即に演算されたa==1 && b==3とa==1 && b==0の論理式を演算の対象としている。 質問2:「評価」と「論理演算」って意味は同じですか?違いますか?違うならその違いは? 質問3:a==1 && b==0 || (a==1 && b==0)の論理式は、先に(a==1 && b==0)の論理式を論理演算すると思ってました。でも、以前そのような仮説をもって質問したら、回答者の方に実際違うと指摘されました。何故ですか?だって()の中の論理式なんだから、優先的に演算されるはず。

    • ベストアンサー
    • Java
  • 論理演算に関する質問です。

    論理演算に関する質問です。 以下の問題を解いてみたんですが正解なのか不正解なのか自信がないので教えてくれませんか? 論理関数 f(A,B,C,D)=_A_C_D+_AB_C+BCD+AB_C+A_BCD が与えられているとき積和形の最簡の論理式で表せ。 解き方ですがまずカルノー図を使って簡単化してみたところ f=_A_C_D+AB_C+BD+ACD という結果になってこれが最簡だと思うのですが当たっているでしょうか?

  • 論理演算子の変数等を結ぶ個数について質問

    int a=1,b=0,c=0のとき a==0 && (b==0 || c==0) a==0 && b==0 || c==0 の2つの論理式あったとします 質問:論理演算子は、必ず「左右2つの変数しかつなげない」のですか? 例えば、前者の論理演算子なら、&&は、a==0とb==0をつないでる。 後者の論理演算子なら、||はb==0 とc==0をつないでる。 質問2:質問1の仮説が正しいとすると、前者も後者も論理演算子&&は、論理演算子||とb==0を共有してますよね?

    • ベストアンサー
    • Java
  • 論理演算について質問

    今度こそ最後にします、、 質問:&&や||等の論理演算子は、「その両側にある2つの型booleanのオペランドに対して論理演算する」こういうことでしょうか? YESかNOでお答えいただいた上で、補足があればお願いします^^ 質問2:私は、括弧内の式が優先的に計算されると思って、その旨の質問をしたところ以下のような回答が返ってきました。 「優先されるのは結合順であって、評価順序ではないです。例えば、a==1 && b==3 || a==1 && b==0の式ににかっこを追加して、a==1 && (b==3 || a==1) && b==0とすると||の第1オペランドは b==3、第2オペランドは a==1 に変わります。」 ここでいう「結合順」の「結合」とはどういう意味ですか? 私の仮説では、「ある演算子がオペランドを結合している」、こういうことでしょうか? そして、括弧を用いることにより、ある演算子のオペランドの結合を変化させ、演算子は その括弧内の両側のオペランドをつなぐ、こういうことでしょうか? YESかNOかでお答えください。その上で何か補足があればお願いします^^

    • ベストアンサー
    • Java
  • 論理演算子は・・・

    論理演算子&&(~と…を同時に満たすときだけ「真」)は、 例えば、(a<b && b<c && c<d) のように、「&&」を2回使う事はできるのでしょうか? また、(a<b || b<c && c<d)のような使い方は可能でしょうか。 教えていただきたいです。

  • 優先順位の概念について質問

    質問1:優先順位や結合の規則とは、本質的に「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」であり、「演算実行の優先順位」ではありませんよね? 何故そう思ったかというと次の論理式をご覧ください。 a==1 && b==0 || a==1 && b==0 ※int a==1,b==0 この論理式がtureになるプロセスとして、 a==1を評価→true    ↓ b==0を評価→true ↓ &&は、a==1 && b==0の論理式をtrueと評価 ↓ ||は、左側の論理式a==1 && b==0がtrueだから、論理式全体がtrueだと判断し、 右側の論理式の評価を行わない。 プロセスとして、こうだと思うんですけど、優先順位として||は&&より低いですよね? 優先順位が「演算実行の優先順位」を意味するならば、右側の論理式のa==1 && b==0を評価してから||の演算をするはずで矛盾します。 よって、優先順位とは本質的に、「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」であり、「演算実行の優先順位ではない」といえる。 質問2:「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」であれば、例えば、上記の論理式の左側を例に挙げていえば、 b==0は&&と||の2つが共有してるが、&&の方が優先順位が高いから、b==0を先に結び付けてる、その意味でも「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」 は正しいですか?

    • ベストアンサー
    • Java
  • 論理演算結果の表示について

    Cで論理演算をするプログラムを考えているのですが、少し行き詰ってしまいました。 例えば(A+B)*(A+B+C)を論理演算で考えた場合、答えはA+Bとなりますがどうすればこの結果を画面に表示させる事ができるのかが分からないのです。 ただ単に #include <stdio.h> int main(void) { int a,b,c,y ; a = 'A'; b = 'B'; c = 'C'; y = a|b & a|b|c; printf("%c\n",y); } としたら表示結果は「C」となってしまいますよね(文字を2進で計算しているからこの結果になるという事は理解しています)。 もしかしてif文を使用して総当り的に文字を調べていくしか方法がないのでしょうか?実際はもっと複雑な演算をプログラムに計算してもらいたいと考えているので、他に方法がないか考えているのですが… どうかよろしくお願い致します。

専門家に質問してみよう