C言語仕様上、論理演算とビット演算の評価対象の範囲は違うのか?

このQ&Aのポイント
  • C言語において、論理演算とビット演算では評価対象の範囲が異なります。
  • 例えば、( (i == 0) && (j == 0) )のような論理演算では、iとjが0である場合に真となります。
  • 一方、( (i == 0) & (j == 0) )のようなビット演算では、iとjの全てのビットが0である場合に真となります。
回答を見る
  • ベストアンサー

論理演算、ビット演算

C言語仕様上、真/偽は(Not0/0)であることは理解しています。また、処理順序から、論理演算とビット演算では評価対象の範囲が違うことも知っているつもりです。 その上で質問させていただきます。 お手数ですが、お解りになる方は教えていただけると助かります。 例えば、 i=0,j=0である場合 ( (i == 0) && (j == 0) )は真であると思いますが、 ( (i == 0) & (j == 0) )は規定されているでしょうか。 また、( (i == 0) | (j == 0) )は真となることが(理論上)保証されているように思えますが、問題ないでしょうか。 以上、よろしくお願いいたします。

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

C言語規格で、 比較演算子(>, <, >=, <=, ==, !=)と論理演算子(!, &&, ||) の返す値は「型はint型。真だったら1、偽だったら0」と決められています。 だから、問題の場合、 ( (i == 0) & (j == 0) )は(1 & 1)となって真(というか1) になります。

tamanegi_majin
質問者

お礼

C言語規格で決まってたんですね。 そうですかぁ。 すっきりしました。ありがとうございます。

関連するQ&A

  • 剰余演算を論理演算と加減算に置き換える方法

    剰余(割算の余り)を求める演算を論理演算と加減算とビットシフトのみで行う方法がありましたら教えてください。 言語はC/C++ではなくても大丈夫です(ロジックだけでも)。

  • エクセルの論理演算について

    A,Bが等しいかどうかの場合、A=B 真なら1 偽なら0 を返す AよりもBが大きいかどうか、 A<B 真なら1 偽なら0 を返す では質問ですが、A,Bが等しくないならば..はどのように記述するのでしょうか。A<>B, A><B, A.ne.B(←これはフォートラン) 今、必要なのは文字列の不一致なのですが。 また、1つ驚いたのですが、A>Bの比較の場合、A,Bのどちらかに数値としての大小比較できないもの(空白の文字、カンマなど)があると驚いたことに1を返すようです。論理演算の対象ではないと判断したら1を返すというのは確か基本なのかも知れませんが、常識からはかなり逸脱しています。ある行が無効となっており数値のところに全角のカンマみたいなものがあり、これを使って当然ゼロと評価すべきところを1と評価して集計してしまうということがありました。 エクセルは複雑に集計するような場合、相当習熟していないと大変大きな失敗を犯すことがあるようです。 以上、よろしくお願いします。

  • perlの論理演算子の「and」と「&&」の違い

    perlの論理演算子の「and」と「&&」の違いは、 「弱い結合」と「強い結合」とかで説明されている のを見かけますが、これは、 「短絡評価」(左側が偽だと右側が実行されない)と 「短絡評価でない」(左側の真偽に関係なく右側が実行される) のと同じ意味になるのでしょうか。 例えば、 sub x {  print "sub x\n";  return 0; } sub y {  print "sub y\n";  return 1; } の2つのサブルーチンがある場合に、 (1) if(&x==1 and &y==1){    print '真',"\n";   } else {    print '偽',"\n";   } (2) if(&x==1 && &y==1){    print '真',"\n";   } else {    print '偽',"\n";   } を、実行した場合、サブルーチンyは、 (1)では実行されず、(2)では実行される という理解で正しいでしょうか。 (実際にはどちらも実行されていないようなのですが)

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

    今度こそ最後にします、、 質問:&&や||等の論理演算子は、「その両側にある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
  • 論理回路について

    論理回路は、1入力のNOTゲートと2入力の様々なゲートを組み合わせて作りますが、これを組み合わせるだけで(3入力などを使わなくても)、N個の入力に対して任意の動作をさせることができるのでしょうか? つまり、任意の関数 f: {0,1}^N → {0,1} は、i番目とj番目に対して {0,1}_i×{0,1}_j → {0,1} と動作し、i,j番目以外に対して恒等演算子として作用する演算子の積でかけるのでしょうか?

  • ビット演算を理解するための参考書を探してます

    ビット演算を理解するための参考書を探してます。 基本情報技術者の午後問題のC言語において、次のリンク先の問題のようにビットを使ったプログラム問題がさっぱり分かりません。 http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H10a2/pm07.html そこで、今までビット演算系の問題に触れていなかったためだと思い、 ビット演算のプログラムを扱った詳しい参考書を探しています。 基礎から上記URLの問題レベルまでの内容のものが特に良いです。 回答よろしくお願いします。

  • 論理学に関する質問

    この二つの定義のどちらも正しいとすると矛盾が生じるのは何故ですか? (恐らく自分が何か間違えていると思うのですが、何が悪いのか分かりません) 1 .排中律の言葉による定義 : 命題は成立するか成立しないかのどちらか以外は起こらない。 2 . 排中律の論理式による定義 : 「P ∨ (¬P) は真」の事である ソース : http://www.ozawa.phys.waseda.ac.jp/pdf/ronritoshugo.pdf 説明 ∨の定義 : 与えられた複数の命題のいずれか少なくとも一つが真であることを示す論理演算(https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E5%92%8C) ∨の定義によって、P ∨ (¬P) は真を満たすためには、Pか¬Pが真であればよい よって、Pが真であって、¬Pは偽ではなくうんこだと仮定しても、P ∨ (¬P)は成り立つため、2の排中律の論理式による定義に違反はしていない しかし、1の排中律の定義には違反している よって二つの定義が正しいとすると矛盾している 先にこれから言われそうなことに対して質問しておきます 1 . 命題には、真か偽しかない そのため、偽でもないうんこというものがあるのはおかしい 1の質問 : 命題には真か偽しかないのであれば、排中律がある意味は何ですか? 2 . Pが真であるとき、¬Pは偽であるから、うんこではない 2の質問”Pが真であるとき、¬Pは偽である”が正しいといえるのは、何故ですか?

  • 三項演算子のカッコについて

    C言語で三項演算子を用いて作成する場合、条件 ? (真の場合) : (偽の場合)のように、括弧をつけてコンパイルするとき、 なぜ括弧がないとコンパイルが通らないか教えてください。

  • C言語のビット演算をPHPでやりたいです。

    下記のようなC言語でのビット演算をPHPに 置き換えたいのですが、どうしてもうまくいきません。 どなたか教えていただけませんでしょうか? よろしくお願いいたします。 bitを左シフトしている箇所と - 0x30の箇所をPHPで どのように書いたら良いのかが困っています。 ★下記コードです。 Value[i]の中には適当な0から9までの整数が1桁ずつ配列で24個入っています。 例えばこんな感じです。 Array ( [0] => 1 [1] => 0 [2] => 1 [3] => 1 [4] => 2 [5] => 0 [6] => 0 [7] => 2 [8] => 1 [9] => 8 [10] => 2 [11] => 0 [12] => 0 [13] => 9 [14] => 1 [15] => 2 [16] => 1 [17] => 1 [18] => 4 [19] => 0 [20] => 1 [21] => 3 [22] => 1 [23] => 0 [24] => 4 ) for(i=0; i<=24; i++) { for(j=0,bit=1; j<8; j++,bit<<=1) { if(Value[i] & bit) { if((j%2)==1) { Cnt1 ++; } } } Cnt2 += (Value[i] - 0x30); } Ans = Cnt1 + Cnt2;

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

    Cを勉強中の者です。論理演算についてよくわからいことがあります。 以下のソースコードを実行し結果が真なら0001、偽なら0000が出力されるプログラムを作りました。 #include <stdio.h> int main(void) { unsigned short a = 0x1234; unsigned short b = 0xfafc; unsigned short c = 0xcdef; unsigned short x, y; x = a && b; y = b && c; printf("x=%04x\n", x); printf("y=%04x\n", y); return 0; } 結果はx=0001, y=0001となります。y=0001はbとcの文字列がそれぞれfとcをを持っているので演算による結果は納得できますが、x=0001はaとbの文字列には共通するものがないのになぜx=0000ではないのでしょうか? また0xが頭に付く表現は16進数だと強調するためにあるのですか? 説明に不足があればまた足しますのでよろしくお願いします。

専門家に質問してみよう