48

次のスニペットに遭遇しました。

pt->aa[!!(ts->flags & MASK)] = -val;
  1. !!(二重感嘆符/感嘆符/ 2つのNOT演算子)はcで何を表しますか?
  2. そうじゃない(!!NULL) == NULL
4

7 に答える 7

78

!否定です。!!否定の否定もそうです。重要なのは、結果がになるという事実ですint

  • !!xの場合、つまりx == 0、つまり。!!0!10
  • !!xの場合、つまりx != 0、つまり、つまり。!!(!0)!!1!01

!!0が0のままであることを確認しながら、ゼロ以外の値を1に変換する場合に一般的に使用されます。

そして確かに!!NULL == NULL、以来!!NULL == !!0!!0 == !1そして最後に!1 == 0

したがって、短いコードで引用した配列の添え字は0、括弧内の式の値がの場合、またはそうでない場合のいずれかNULLになり1ます。

于 2013-02-07T13:14:16.900 に答える
28

intブール否定演算子を繰り返し適用することにより、任意の値をs 0または1に変換するために一般的に(ab)使用されます!

たとえば!56、ブール値として表示した場合、56は「真」であるため、は0です。これは、!!56が1であるため、が1であることを意味し!0ます。

于 2013-02-07T13:15:21.900 に答える
7

!Eと同じE == 0です。!!Eと同じ(E == 0) == 0です。!!ブール値を正規化するために使用されます。

于 2013-02-07T13:15:34.937 に答える
4

C99では、次のように置き換えることができます

#include <stdbool.h>


pt->aa[(bool)(ts->flags & MASK)] = -val;

もちろん、コードをC89に移植できるようにする場合は、実行したほうがよいでしょう。トリックまたは

pt->aa[(ts->flags & MASK)!=0] = -val;

また

pt->aa[(ts->flags & MASK)?1:0] = -val;

生成されたコードは確かに同一です。

于 2013-02-07T14:28:05.400 に答える
3

数値を正規のブール値に変換します。

また、この場合、結果は配列のインデックス付けに使用されるため、これを行うことが重要であることに注意してください。

于 2013-02-07T13:15:13.713 に答える
2
  1. !!xはただの!(!x)です。
  2. NULLが0として定義されている場合、 !!NULL == !!0 == !(!0) == !(1) == 0
于 2013-02-07T13:15:40.313 に答える
1

!! は、複数の式を使用した条件付きでの割り当てなど、特定の状況でコンパイラを静めるための適切な方法です。例:

int _blah = 100;
int *blah;
if ( _blah > 100 && !!(blah = &_blah) ) {
// do stuff
}

私はこれをお勧めしません-警告は通常、適切なコーディング慣行を強制するためにあります。

于 2013-02-07T21:42:45.557 に答える