dポイントプレゼントキャンペーン実施中!

!演算子の動きが知りたいです。

!0なら1になる
!1なら0になる
のは解るのですが
!3など数値を入れた場合、0になるのはどの様な内部処理なのでしょうか?

ビット演算
0011
 ↓
0 or 0 or 1 or 1
 ↓
 1
 ↓
 !1
 ↓
 0

上記と考えているのですが、アドバイスよろしくお願いします。

A 回答 (6件)

>!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;
    • good
    • 0
この回答へのお礼

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

非常に学習になりました。

お礼日時:2011/10/03 08:06

・C において「真理値を返す演算子」が返すのは必ず 0 か 1


・C++ において bool を int に変換すると false は 0, true は 1 になる (「NULL が 0 か」と同様「true が 1 で表現されている」というわけではないが)
です>#3.
    • good
    • 0

手元にあったJIS規格書(X 3010-1993)の記述:


6.3.3.3 単項演算子
 論理演算子!の結果は,そのオペランドの値が0と比較して等しくない場合0とし,等しい場合1とする。結果の型は,intとする。式!Eは,(0==E)と等価とする。

回答No.2のとおりです。
    • good
    • 1

因みに、!演算子は、インテル系の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レジスタに作られるとは限らない)
    • good
    • 0

「0なら1」、「0以外なら0」という動作しているだけかと。



…正しくは「真なら偽」「偽なら真」かと思われますが……。
# 0が偽、0以外が真…とか。
    • good
    • 2

否定演算子!はビット演算ではなく論理演算子です。


!true=false
!false=true
というものです。
Cでは「0でない」ものは論理演算子ではTrueなので「!3」はFalseとなり、内容を見ると0(false)になります。

Cのビット演算子は~(チルダ)です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!