C 用法!!在检查标志时
我在开源库中看到了一些代码。他们检查变量中是否设置了特定标志,如果C 用法!!在检查标志时,c,C,我在开源库中看到了一些代码。他们检查变量中是否设置了特定标志,如果!!(标志和标志1) 我的问题是,为什么不直接编写if(flag&FLAG1)?第一个版本是否更优化?转换为相反的布尔值,然后再转换回。第一个逻辑运算符将任何返回值转换为相反的布尔值,然后第二个逻辑运算符将相反的值转换回 例如: bool b = !!(flag & FLAG1); 将flag&FLAG1返回值转换为布尔值 除非您想混淆源代码,否则不要使用这种语句。相反,您可以使用普通的转换来清楚地表达您想要做的事情 b
!!(标志和标志1)
我的问题是,为什么不直接编写if
(flag&FLAG1)
?第一个版本是否更优化?代码>转换为相反的布尔值,然后再转换回。第一个逻辑运算符将任何返回值转换为相反的布尔值,然后第二个逻辑运算符将相反的值转换回
例如:
bool b = !!(flag & FLAG1);
将flag&FLAG1
返回值转换为布尔值
除非您想混淆源代码,否则不要使用这种语句。相反,您可以使用普通的转换来清楚地表达您想要做的事情
bool b = (bool)(flag & FLAG1);
它可以这样使用:
int a=!!(flag & FLAG1);
如果flag&FLAG1
的计算结果为0,则a
将被分配为0。如果flag&FLAG1
计算为另一个值,则a
将被指定为1。如果没有更多的上下文,很难知道作者这样做的原因,但最常见的是它将值转换为0或1。如果您使用的是\u内置的
,那么这一点尤其有趣,在这种情况下,它可以产生更好的优化代码
偶尔也会使用它来让代码更加自我记录……如果你看到它,你就会知道你应该将它视为真/假。通常,像这样使用时,它是宏的一部分
还值得注意的是,结果是一个int
,与原始类型无关。这通常并不重要,但有时很重要。标志的类型是什么?请改进您的问题:标题拼写,并准确解释标志的类型和标志1的值。两者都很重要。因此,编辑您的问题以改进它。如果没有这一点,您的问题就不清楚了。请提供一段代码来说明这一点。包括整行,可能还有一些周围的行。您从未解释过使用的原因代码>。该值将为0或1,但结果为
是一个int
,而不是\u Bool
@klutt他是说OP没有(
在if之后是非法的。它应该写为if(!!(flag&FLAG1))
更重要的是,当分配给int时,它将是0
或1
,而不是其他值。这对于main
函数很有用,其中exit code module 256是shell返回值;从main返回256
与返回0
相同,这在非ze时是不需要的ro表示错误。这是有道理的。谢谢。