
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;
アドバイスありがとうございます。
「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で質問しましょう!
似たような質問が見つかりました
- 物理学 この波動関数の複素共役はなんですか? 2 2022/08/17 00:32
- 英語 切り分けて形ある物となった食べ物の可算、不可算の扱いについて 6 2022/11/03 16:10
- 会社・職場 施工管理になるため研修しとります んで、積算ってやつ演習問題解けへんのやけどそれでも施工管理としてや 1 2023/06/07 17:14
- 数学 「FFTの基本は、DFTはサンプル数Nが偶数なら 2つのDFTに分解できるということ。 分解するとD 3 2022/03/31 21:01
- 物理学 スピン 行列表示 固有状態 測定値 1 2022/08/16 18:39
- Excel(エクセル) エクセルの演算子の利用について 3 2023/06/19 19:49
- 英語 "whether SV that SVO or not"のnotが何を否定するのかの確認について 1 2023/06/01 09:18
- 情報処理技術者・Microsoft認定資格 2進数の問題を教えてください。 1 2022/07/27 09:42
- 哲学 AIと人間の思考の違い 12 2023/02/04 12:21
- システム CPUの問題について 2 2022/07/09 12:04
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MATLABのfor文の使い方について
-
≪C言語≫キー入力の判断について
-
行列をベクトルに(C言語)
-
python numpyで行列作成
-
フランク行列の逆行列を求める...
-
フォートラン77での微分と行列
-
教えて下さい
-
UserForm1.Showでエラーになり...
-
メッセージボックスのOKボタ...
-
お助けください!VBAのファイル...
-
マクロ実行時、ユーザーフォー...
-
エクセルでの「外部データの取...
-
Excel・Word リサーチ機能を無...
-
Excel_マクロ_現在開いているシ...
-
fortran おそらく二重解法のエラー
-
配列数式の解除
-
Teraterm 1行空白を入れたい。
-
エクセルで特定の列が0表示の場...
-
マクロで、別ブックのデータを...
-
Excelのセル値に基づいて図形の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
繰り返し1行~28行までを順順に...
-
MATLABにおける行の挿入方法
-
!(否定)演算子について
-
H8マイコン C言語でのプロ...
-
C言語で余りがマイナスになる場合
-
C++
-
Z80のフラグレジスタについて
-
ExcelのVBAのテクニック
-
Pythonで行列の要素積(アダマ...
-
Matlabのspdiags関数
-
if文について教えてください
-
8085系プログラミングについて
-
五目並べ
-
matlab、対角行列の作り方
-
OPENCVを使ったエピポーラ幾何...
-
cのプログラミングで虚数を含...
-
mathematicaの質問です
-
パイソンのプログラミングにつ...
-
収束計算
-
演算装置とフラグレジスタの関係
おすすめ情報