我在开源库中看到了一些代码。他们检查是否在带有测试的变量中设置了特定标志!!(flag & FLAG1)
我的问题是,为什么不简单地写一下(flag & FLAG1)
呢?第一个版本是否更加优化?
答案 0 :(得分:7)
可以这样使用:
int a=!!(flag & FLAG1);
如果flag & FLAG1
评估为0,则a
将被指定为0.如果flag & FLAG1
评估为其他值,则a
将被指定为1。
答案 1 :(得分:1)
<div class="container-mod"><h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corrupti doloribus beatae laboriosam aspernatur magni, molestias possimus, rerum voluptates dolorum aliquam est soluta animi inventore ut at eius voluptatum quod omnis.</h1></div>
转换为相反的布尔值,然后转换回来。第一个逻辑运算符将任何返回值转换为相反的布尔值,然后第二个逻辑运算符将转换相反的值。
例如:
!!
将bool b = !!(flag & FLAG1);
返回值转换为布尔值。
除非您想混淆源代码,否则不要使用此类语句。相反,您可以使用普通转换来清楚地表达您想要做的事情
flag & FLAG1
答案 2 :(得分:1)
如果没有更多的上下文,很难知道作者这样做的原因,但最常见的是它将值转换为0或1.如果你使用__builtin_expect()
,这个特别有意思,在这种情况下,是的,它可以产生更好的优化代码。
偶尔也会使用它来使代码更加自我记录......如果你看到它,你知道你的意思是将它视为真/假。通常,当像这样使用时,它是宏的一部分。
值得注意的是,无论原始类型如何,结果都是int
。这通常不是 重要的,但有时它很重要。