这是什么意思!!在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