1

重複の可能性:
C の二重否定: 0/1 を返すことが保証されていますか?

int main(void)
{
  int i = 2, j = 1;

  printf("%d", !!i +!j);
  return 0;
}

私が理解していることから、!! 式をブール値に変換します。つまり、i が 2 に等しくないため、値は 0 + j であり、1 に等しくないため、値は 0 であり、0 は false に等しいため、次のように読み取ります: false + false = true 1 の値を表します。C プログラミングが初めてなので助けてください。

4

3 に答える 3

7

Cにはブール型がありません(C99以降はそうですが、プログラムにはそれを使用するものは何もありません)。

!は単項演算子であり、他のものは0に変わります。したがって、あなたの場合、is 、is 、およびisです。 は、そうです。それは のままで、あなたは を印刷しています。このサンプル プログラムを試して、動作を確認してください。10i2!i0!!i1j1!j0!!i + !j1 + 01

#include <stdio.h>

int main(void)
{
    int i = 2, j = 1;

    printf("i = %d, j = %d\n", i, j);
    printf("!i = %d, !!i = %d\n", !i, !!i);
    printf("!j = %d\n", !j);
    printf("!!i + !j = %d + %d = %d\n", !!i, !j, !!i + !j);
    return 0;
}
于 2012-07-16T23:39:44.410 に答える
2

!xxtrue の場合 (0 に等しくない)は 0、xfalse の場合 (0 に等しい) は 1 です。あなたの例iは2!iなので、0になり、したがって!!i1になります。同様!jに0になります。したがって、式の結果は になります1 + 0 = 1

0 + 0(つまり、偽 + 偽) が 1になる状況は存在しないことに注意してください。

于 2012-07-16T23:40:24.900 に答える
0

オペレーターに関する仕様書の内容は次の!とおりです (C99 §6.5.3.3/5)。簡潔な最後の文は、その動作を理解するために本当に必要なすべてです。

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

結果の型はintです。

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

3 番目の文の変換を使用して、式 を評価できます!!i + !j。変換は次のようになります。

(0 == (0 == i)) + (0 == j)

そして、次のように評価できます。

(0 == (0 == 2)) + (0 == 1) // substitute the variable values
(0 == (0     )) + (0 == 1) // 0 == 2 is false, so it becomes 0
(0 == (0     )) + (0     ) // 0 == 1 is false, so it becomes 0
(1            ) + (0)      // 0 == 0 is true, so it becomes 1
 1                         // 1 + 0 is 1
于 2012-07-16T23:42:09.707 に答える