【问题标题】:Why use !!(condition) instead of (condition)? [duplicate]为什么使用!!(条件)而不是(条件)? [复制]
【发布时间】:2023-03-30 12:45:01
【问题描述】:

我看到人们使用带有两个 '!' 的条件子句的代码

#define check_bit(var, pos)       (!!((var) & (1 << (pos))))
#define likely(x)       __builtin_expect(!!(x),1)
#define unlikely(x)     __builtin_expect(!!(x),0)

是我能找到的一些例子。

使用!!(condition) 比使用(condition) 有什么优势吗?

【问题讨论】:

  • 另见 thisthisthis 等等...
  • 天哪,对不起!
  • @Siidheesh 这取决于您的搜索方式,我最初的搜索也没有出现,但后来稍作修改。我个人没有发现任何一个 dup 像我发现的内核新手线程那样一针见血地为那个金块做这件事,这可能是值得的。此外,基思的解释也比大多数其他人的解释要好得多,但他通常会写出很好的答案。
  • 是的,搜索双重否定就可以了

标签: c logical-operators


【解决方案1】:

如果您应用的变量!! 还不是bool零或一),那么它会将值规范化为@987654325 @ 或1

关于__builtin_expectkernel newbies thread 讨论了符号,其中一个回复解释了(强调我的):

__builtin_expect 的签名

http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html) 是:

long __builtin_expect (long exp, long c)

注意 exp 参数应该是一个整数表达式,因此没有指针 或那里的浮点类型。 双重否定处理从 这些类型自动积分表达式。这样,您可以简单地 写:可能(ptr)而不是可能(ptr!= NULL)

C99 中的参考bool 宏扩展为_Booltrue 扩展为1false 扩展为0。详细信息在草案标准部分7.16 布尔类型和值中给出。

逻辑否定在第 5 段中的 6.5.3.3 一元算术运算符中介绍:

逻辑否定运算符的结果!如果其操作数的值比较,则为 0 不等于 0,如果其操作数的值比较等于 0,则为 1。结果的类型为 int。 表达式 !E 等价于 (0==E)。

【讨论】:

    【解决方案2】:

    一元逻辑否定运算符! 应用于任何标量,如果其操作数非零,则产生int0,如果操作数等于零,则产生1。引用标准:

    表达式!E 等价于(0==E)

    ! 两次应用于相同的标量值会产生一个结果,如果值为假,则为假,如果值为真,则结果为真——但结果分别归一化为01

    在大多数情况下,这不是必需的,因为任何标量值都可以直接用作条件。但在某些情况下,您实际上需要 01 值。

    在 C99 或更高版本中,将表达式转换为 _Bool(或 bool,如果您有 #include &lt;stdbool.h&gt;,其行为类似并且可能被认为更清晰。但是 (a) 结果是 _Bool 类型而不是 @ 987654336@,以及 (b) 如果您使用的是不支持 _Bool 的 C99 之前的编译器,并且您已经定义了自己的 bool 类型,则它的行为方式与 C99 的 _Bool 不同.

    【讨论】:

      【解决方案3】:

      我能看到的最大的是,无论xvar 表达式如何扩展(例如chardoubleint 或等)。

      【讨论】:

        【解决方案4】:

        它转换为布尔值,这有时很有用。

        【讨论】:

        • 这是 C 而不是 C++ - 没有布尔值。
        • C 不是缺少原生布尔类型吗?
        • 如果包含stdbool.hC 中有bool
        • 最初 C 没有布尔类型,所以人们习惯于使用 int 表示布尔值并将整数(在 int 中)转换为“布尔值”(在 int 中)跨度>
        • @Siidheesh _Bool 是原生类型。
        猜你喜欢
        • 1970-01-01
        • 2010-12-09
        • 1970-01-01
        • 2018-07-14
        • 1970-01-01
        • 1970-01-01
        • 2012-12-13
        • 2021-11-12
        • 1970-01-01
        相关资源
        最近更新 更多