
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;
この回答へのお礼
お礼日時:2011/10/03 08:06
アドバイスありがとうございます。
「0でない値」の部分が非常に参考になりました。
そう考えるとしっくりきます。
非常に学習になりました。
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レジスタに作られるとは限らない)

No.1
- 回答日時:
否定演算子!はビット演算ではなく論理演算子です。
!true=false
!false=true
というものです。
Cでは「0でない」ものは論理演算子ではTrueなので「!3」はFalseとなり、内容を見ると0(false)になります。
Cのビット演算子は~(チルダ)です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Replace関数について教えて...
-
DLLファイルの逆コンパイラにつ...
-
逆コンパイルと逆アセンブルの...
-
CSSが全く分かりません、お助け...
-
プログラマー達は何故、プログ...
-
Windows Formアプリからコンソ...
-
次の日本語の意味を教えて下さい
-
プログラム言語について c言語...
-
バッチファイルで以下のような...
-
Cのプログラムからアクセスでき...
-
C#でTreeViewのCheckBoxのサイ...
-
c#のTLS1.2での通信について
-
今ってプログラミング言語は何...
-
gccを行ってもexeファイルが生...
-
最初に聞かれたこと
-
プログラミング言語についてc++...
-
PIC12F1822でLED調光器を作りたい
-
C言語について(初心者)
-
プログラミングc++を全く分か...
-
C# で 数式文字列処理を処理す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
繰り返し1行~28行までを順順に...
-
MATLABにおける行の挿入方法
-
c言語
-
C言語で余りがマイナスになる場合
-
!(否定)演算子について
-
五目並べ
-
Matlabのspdiags関数
-
StandardMLで整数リストの奇数...
-
Z80のフラグレジスタについて
-
matlab、対角行列の作り方
-
H8マイコン C言語でのプロ...
-
Pythonの公式リファレンスガイド
-
最大値を見つけるプログラム。
-
【MATLAB】配列内の数値のキャ...
-
MATLABのデータ抽出についてお...
-
OPENCVを使ったエピポーラ幾何...
-
パイソンのプログラミングにつ...
-
教えて下さい
-
特定のPCだけ動作しないVBAマク...
-
配列数式の解除
おすすめ情報