• ベストアンサー

!(否定)演算子について

!演算子の動きが知りたいです。 !0なら1になる !1なら0になる のは解るのですが !3など数値を入れた場合、0になるのはどの様な内部処理なのでしょうか? ビット演算 0011  ↓ 0 or 0 or 1 or 1  ↓  1  ↓  !1  ↓  0 上記と考えているのですが、アドバイスよろしくお願いします。

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

  • ベストアンサー
回答No.3

>!0なら1になる 違います。 「!0なら非0になる」です。 「0でない値」と決まっているだけで、1になる保証はありません。0以外の何になるかは決まっていません。 なので「1になる筈」として1と比較すると「1とは異なる」と言う結果になる事があります。 >!1なら0になる 違います。 「!非0なら0になる」です。 非0は「0でないなら、何でもよい」ので、1でも2でも3でも65535でも2147483647でも構いません。 これを理解するには、bool型を理解しておく必要があります。 C++から導入された「bool型」は「trueかfalseの値を格納できる型」と定義されています。 そして「falseは0」「trueは0でない値」と定義されています。 「0でない値」は、1かも知れないし、2かも知れないし、-1かも知れないし、255かも知れません。「0でない」としか決まっていないのです。 なので「ある処理系ではtrueの実際の値は1なのに、別の処理系ではtrueの実際の値は-1になっている」って事も有り得ます。 >!3など数値を入れた場合、0になるのはどの様な内部処理なのでしょうか? 例えば bool f; f = !3; と書くと、以下のプログラムと同等の実行コードになります。 bool f; if (3 == 0) f = true else f = false; なお「!3」や「(3 == 0)」などは「常に同じ結果になる」ので、コンパイル時に最適化され、以下のプログラムと同等になります。 bool f; f = false;

abuhiro
質問者

お礼

アドバイスありがとうございます。 「0でない値」の部分が非常に参考になりました。 そう考えるとしっくりきます。 非常に学習になりました。

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

・C において「真理値を返す演算子」が返すのは必ず 0 か 1 ・C++ において bool を int に変換すると false は 0, true は 1 になる (「NULL が 0 か」と同様「true が 1 で表現されている」というわけではないが) です>#3.

すると、全ての回答が全文表示されます。
回答No.5

手元にあったJIS規格書(X 3010-1993)の記述: 6.3.3.3 単項演算子  論理演算子!の結果は,そのオペランドの値が0と比較して等しくない場合0とし,等しい場合1とする。結果の型は,intとする。式!Eは,(0==E)と等価とする。 回答No.2のとおりです。

すると、全ての回答が全文表示されます。
回答No.4

因みに、!演算子は、インテル系のCPUの命令コードで、以下のようになります。 MOV ECX,[メモリ] ; ECXレジスタに評価する値を持って来る XOR EAX,EAX ; EAXレジスタを0にする TST ECX ; ECXレジスタの値によってZフラグをセット BNE $+3 ; Zフラグが立ってないならINC EAXの次の命令にジャンプ INC EAX ; EAXをインクリメントして1にする MOV [メモリ],AL ; 結果をbool型変数のメモリに格納(bool型変数のサイズは1バイトと想定) インテル系のCPUでは、式の演算結果は「EAXレジスタに作られるのが基本」なので、上記命令コードを実行すると、EAXレジスタにtrueかfalseの値が作られ、それが変数用メモリに格納されます(但し、最適化を行った場合は、EAXレジスタに作られるとは限らない)

すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

「0なら1」、「0以外なら0」という動作しているだけかと。 …正しくは「真なら偽」「偽なら真」かと思われますが……。 # 0が偽、0以外が真…とか。

すると、全ての回答が全文表示されます。
  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

否定演算子!はビット演算ではなく論理演算子です。 !true=false !false=true というものです。 Cでは「0でない」ものは論理演算子ではTrueなので「!3」はFalseとなり、内容を見ると0(false)になります。 Cのビット演算子は~(チルダ)です。

すると、全ての回答が全文表示されます。

関連するQ&A