这是什么意思!!在C中——为什么需要它?

这是什么意思!!在C中——为什么需要它?,c,equation,not-operator,C,Equation,Not Operator,可能重复: 在阅读一段代码时,我读到: flush = ! !(flags & GST_SEEK_FLAG_FLUSH); 我没有得到什么这里的意思。 这句话是什么意思 编辑: 我知道这是一个双负。将非布尔数据转换为布尔的技巧 但这有什么必要呢?这里flush是bool,那么如果您将任何非零项分配给bool,它将被视为1,零项将被视为0,那么这样做有什么好处?这是一个双负。这是一种将非布尔表达式(如flags&GST\u SEEK\u FLAG\u FLUSH)转换为bool的方法。

可能重复:

在阅读一段代码时,我读到:

flush = ! !(flags & GST_SEEK_FLAG_FLUSH);
我没有得到什么
这里的意思。
这句话是什么意思

编辑:

我知道这是一个双负。将非布尔数据转换为布尔的技巧


但这有什么必要呢?这里flush是bool,那么如果您将任何非零项分配给bool,它将被视为1,零项将被视为0,那么这样做有什么好处?

这是一个双负。这是一种将非布尔表达式(如
flags&GST\u SEEK\u FLAG\u FLUSH
)转换为
bool
的方法。我个人更喜欢:


flush=(flags&GST\u SEEK\u FLAG\u flush)!=0;

这是双底片。这是一种将非布尔表达式(如
flags&GST\u SEEK\u FLAG\u FLUSH
)转换为
bool
的方法。我个人更喜欢:


flush=(flags&GST\u SEEK\u FLAG\u flush)!=0;

只是想为您添加一个可能会澄清问题的小示例

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

输出为1

只是想为您添加一个可能会澄清问题的小示例

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

输出为1

如果
flush
是布尔变量,并且您强制对其使用一些非布尔值,则某些编译器将生成一个警告,强制将值设置为bool'true'或'false'。因此,使用双重否定更安全。

如果
flush
是布尔变量,并且您强制它使用一些非布尔值,则某些编译器将生成一个警告,强制将值设置为bool'true'或'false'。因此,使用双重否定更安全。

某些编译器(如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;
}
#包括
内部主(空){
int x=10;
bool y=x;//警告C4800:'int':强制值bool为'true'或'false'(性能警告)
返回0;
}
双重否定技巧是转换为bool并防止此警告的一种方法,但是我倾向于
!=0
检查Jim Buck建议的清晰性。

某些编译器(如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;
}
#包括
内部主(空){
int x=10;
bool y=x;//警告C4800:'int':强制值bool为'true'或'false'(性能警告)
返回0;
}


双重否定技巧是转换为bool并防止此警告的一种方法,但是我倾向于
!=0
检查Jim Buck建议的清晰性。

可能有人将逻辑NOT(
)与按位NOT(
~
)混淆了?但是需要什么呢??这里flush是bool,那么如果您将任何非零项分配给bool,它将被视为1,而将零iteam视为0,那么这样做有什么好处?@Mr.32它用于检查
GST\u SEEK\u FLAGS\u flush
位是否设置在
FLAGS
变量中。这可能是重复的,但不是问题所在。这是C++,它有这些有趣的额外数据类型。这是C.@Mr.32:嗯,布尔并不总是在。在c99之前的C版本中,没有
bool
。它只是一个
int
,里面可以有任何数字。因此,如果
flush
仍为int,则
(flag&GST\u SEEK\u flag\u flush)
的结果可能具有值0或
GST\u SEEK\u flag\u flush
。和
GST\u SEEK\u FLAG\u FLUSH
可以是
1
,但也可以是
4
。现在,如果要确保表达式的结果是
0
1
,而
flush
是int,则可以编写
(flags&GST\u SEEK\u FLAG\u flush)!=0
或您所看到的
!!(flags&GST\u SEEK\u FLAG\u FLUSH)
。也许有人把逻辑NOT(
)和按位NOT(
~
)搞混了?但需要什么呢??这里flush是bool,那么如果您将任何非零项分配给bool,它将被视为1,而将零iteam视为0,那么这样做有什么好处?@Mr.32它用于检查
GST\u SEEK\u FLAGS\u flush
位是否设置在
FLAGS
变量中。这可能是重复的,但不是问题所在。这是C++,它有这些有趣的额外数据类型。这是C.@Mr.32:嗯,布尔并不总是在。在c99之前的C版本中,没有
bool
。它只是一个
int
,里面可以有任何数字。因此,如果
flush
仍为int,则
(flag&GST\u SEEK\u flag\u flush)
的结果可能具有值0或
GST\u SEEK\u flag\u flush
。和
GST\u SEEK\u FLAG\u FLUSH
可以是
1
,但也可以是
4
。现在,如果要确保表达式的结果是
0
1
,而
flush
是int,则可以编写
(flags&GST\u SEEK\u FLAG\u flush)!=0
或您所看到的
!!(标志和GST_SEEK_FLAG_FLUSH)
。但需要什么呢??这里flush是bool,那么如果您将任何非零项分配给bool,它将被视为1,零iteam将被视为0,那么这样做有什么好处?@Mr.32也许稍后<代码>如果(1==flush){…}
。因为有时候“bool条件检查”是通过假设显式完成的(我们都知道假设…;-),而不是像
if(flush){…}
那样隐式完成的。另外,
flush
可以在完全不同的上下文中使用,其中必须为1/0才能反映有效值,因此前面的示例只是一个例子。“比抱歉更安全”,保持一致将使“抱歉”最小化:)是的,这只是保证它是一个合法的布尔值,而不仅仅是一个非零值。但是,它混淆了代码,所以我同意它看起来像胡说八道,因此我更喜欢我发布的版本。它正确地把它变成了一个布尔,看起来就像大脑所期待的那样。但这需要什么呢??这里flush是bool,如果你分配了n