Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用法!!在检查标志时_C - Fatal编程技术网

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表示错误。这是有道理的。谢谢。