我看过一些代码,其中人们使用了带有两个“!”的条件子句s
#define check_bit(var, pos) (!!((var) & (1 << (pos))))
#define likely(x) __builtin_expect(!!(x),1)
#define unlikely(x) __builtin_expect(!!(x),0)
这是我能找到的一些例子。
使用有什么好处吗!!(条件)
超过(条件)
?
我能看到的最大的一点是,它将强制(或规范化)值为1
或0或
varchardoubleint
一元!
逻辑否定运算符,应用于任何标量,如果其操作数非零,则产生int
值0
,如果操作数等于零,则产生1
。引用标准:
表达 !E
等价于 (0==E)。
应用<代码>!对同一个标量值执行两次操作会产生一个结果,如果该值为false,则为false;如果该值为true,则为true——但是结果会分别规范化为< code>0或< code>1。
在大多数情况下,这不是必需的,因为任何标量值都可以直接用作条件。但在某些情况下,您实际上需要0
或1
值。
在 C99 或更高版本中,将表达式转换为 _Bool
(如果有,则转换为布尔
值#include
如果你使用的变量是< code >!!还不是一个< code>bool(零或一),那么它会将值规范化为< code>0或< code>1。
关于__builtin_expect
,这个内核新手线程讨论了符号,其中一个响应解释了(强调我的):
__builtin_expect的签名
http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html)是:
long __builtin_expect(长exp,长c)
请注意,exp参数应该是一个整数表达式,因此这里没有指针或浮点类型。双重否定处理从这些类型到整数表达式的自动转换。这样,您可以简单地写:like(ptr)而不是like(ptr!=NULL)。
用于C99bool
宏扩展为_Bool
,true
扩展为1
和false
扩展为0
。详细信息在标准草案部分7.16
布尔类型和值中给出。
逻辑否定在第5段的6.5.3.3
一元算术运算符中涉及:
逻辑否定运算符的结果!如果其操作数的值比较不等于 0,则为 0;如果其操作数的值比较等于 0,则为 1。结果的类型为 int。表达 !E 等效于 (0==E)。
问题内容: 我有以下简单的短路语句,应显示一个组件或不显示任何内容: 如果该语句为假,则呈现a 而不是什么。 我所做的只是为了快速查看该属性的状态,它是预期的1或0。0应该为假…什么也不会渲染。对? 知道为什么会这样吗? 问题答案: 因为你的条件是falsy,因此不会返回第二个参数(),它会返回,这是一个数字,所以反应会使其因为阵营跳过渲染什么,是 或 ,并会呈现什么是 或 : 为了安全起见,您可
问题内容: 我有2个Java类和,它们都存在于数据库中。 人: 关系: 每个人都有(或没有)关系列表,当关系的child_id或parent_id等于该人的id时,应将关系添加到列表中。 TL; DR:当=>将关系添加到与人的关系列表中时 我面临的问题是该注释: 创建以下SQL(只是必要的部分): Java Hibernate中正确的注释是什么,以生成一条用 OR* 代替 AND 的SQL语句 *
问题内容: 我想知道Java(或更普遍的是:在编程中)的一些情况,在布尔表达式中首选使用无条件()而不是有条件版本()。 我知道它们是如何工作的,但是我想不出使用单曲值得的情况。 问题答案: 我发现在现实生活中的情况下,表达的双方都真的很便宜,所以它剃掉了一两纳秒避免分支,使用无条件代替。(不过,这些都是极高性能的数学实用程序;我几乎永远不会在其他代码中使用它,并且如果没有详尽的基准测试来证明它更
我非常熟悉这个框架,从一开始我就喜欢它。 有一件事我还不能完全理解,那就是为什么打字有时会中断。 特别是对于这个问题,,我不确定为什么没有使用,起初我认为可能是int32/int16/float等之间的行为差异。。但(对我来说)这在透明化中是没有意义的。 因此,从lib来看,它需要很好地处理数学问题。 我的问题是关于语义的,为什么决定使用而不是?
我有一个函数,它接收一个字符串参数,并在这个函数中检查这个参数是int还是float。尽管此条件的结果为false,但仍将执行以下行。 我使用PyCharm IDE和Python 3.8 这是代码。 输出:
问题内容: 尝试编译时出现“不是语句”的编译错误,代码为: 当这些功能是: 有任何想法吗? 问题答案: 是的,您不能像这样使用条件运算符。其目的是计算一个或另一个 表达式 。它并不是要选择一个要执行的 语句 或另一条 语句 的方法。 只需使用: