1

重複の可能性:
C++コードの二重否定

私が読んだ1つのコードを読んでいる間:

flush = ! !(flags & GST_SEEK_FLAG_FLUSH);

!!ここで何を意味するのかわかりません。この文は何をしますか?

編集:

私はそれを二重否定にした。非ブールデータをブールに変換するトリック

しかし、その必要性は何ですか?ここでフラッシュはブール値です。ゼロ以外のアイテムをブール値に割り当てると、1として扱われ、ゼロのアイテムは0として扱われるので、これを行うことの利点は何ですか?

4

4 に答える 4

9

それは二重否定です。flags & GST_SEEK_FLAG_FLUSHこれは、ブール式ではない式(など)を。に変換する方法boolです。私は個人的に好きです:

flush = (flags & GST_SEEK_FLAG_FLUSH) != 0;

于 2011-12-15T06:01:41.000 に答える
2

物事をクリアするかもしれないあなたのための小さな例を追加したかっただけです。

 main()
 {
 int i=10;
 printf("%d",!!i);
 }

出力は1です

于 2011-12-15T06:15:55.763 に答える
2

flushブール変数であり、それに非ブール値を強制すると、一部のコンパイラは警告強制値をブール'true'または'false'に生成します。したがって、二重否定を使用する方が安全です。

于 2011-12-15T06:33:06.647 に答える
2

一部のコンパイラ(Visual Studioなど)は、ブール値以外の型をintに強制変換すると、次のように警告します。

#include <stdio.h>

int main(void) {
    int x = 10;
    bool y = x; // warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)
    return 0;
}

!= 0二重否定のトリックは、ブール値に変換してこの警告を防ぐ1つの方法ですが、明確にするためにジムバックが推奨するチェックに傾倒します。

于 2011-12-15T06:35:37.630 に答える