2

私の質問は単純に見えますが、私はそれについて当惑しています:

bool myBool = TRUE;
if (myBool) printf("1 myBool = true\n");
    else printf("1 myBool = false\n");
myBool = !myBool;
if (myBool) printf("2 myBool = true\n");
    else printf("2 myBool = false\n");

printf("%d\n", TRUE);
printf("%d\n", FALSE);

そのすべての出力:

1 myBool = true;
2 myBool = false;
1
0

それがアウトプットである理由を理解しています。私の質問は、どうすれば!1同等になることができるfalseかということです。CおよびC++では、ifゼロ以外の値をチェックするためです。そして最後にチェックしたとき:

TRUE = 0x00000001
FALSE = 0x00000000

したがって:

!TRUE = !0x00000001 = 0xfffffffd != 0

編集:この混乱は、aがオンではなくビット単位でnot eax, eax実行されるx86アセンブリを学習していた期間に起因していると思います(Cの場合と同等)。eaxeax = ~eax

4

3 に答える 3

10

論理否定とビット単位の補集合を混同しています。!演算子は、入力がゼロ以外の場合は0を返し、それ以外の場合は1を返します。演算子は入力の~ビットを反転します。これは、!0 = 1とを意味します。!1 = 0これは、を使用する場合には当てはまりません~

ifまた、ステートメントは値がゼロか非ゼロかをチェックすることを忘れないでください。したがって、ブール値がであったとしても、ifステートメントで0xFFFFFFFE評価されます。true

お役に立てれば

于 2012-07-11T04:20:50.060 に答える
5

他の回答を補完するために、仕様には次のように記載されています(C99§6.5.3.3/ 5)。

論理否定演算子の結果は、!その0オペランドの値がと等しくない場合01そのオペランドの値がと等しくなる場合0です。

結果のタイプはint

!Eはと同等(0==E)です。

于 2012-07-11T04:22:22.883 に答える
2

!論理 not演算子であるため、ゼロ以外の入力は0の結果を生成し、0の入力は1の結果を生成します。

あなたが考えている結果は、のようにビット単位ではなくを使用することから得られ~trueます。

于 2012-07-11T04:22:00.263 に答える