【问题标题】:Usage of !! while checking flags [duplicate]使用!!在检查标志时[重复]
【发布时间】:2018-09-06 16:11:22
【问题描述】:

我在开源库中看到了一些代码。他们通过测试 if !!(flag & FLAG1) 来检查变量中是否设置了特定标志

我的问题是为什么不直接写 if (flag & FLAG1) 呢?第一个版本是否更优化?

【问题讨论】:

  • flag的类型是什么?
  • 请改进您的问题:标题拼写,并准确解释flag 的类型和FLAG1 的值。两者都很重要。所以编辑你的问题来改进它。没有这个,你的问题就不清楚了。
  • 请通过提供一段代码来说明这一点。包括整条线,也许还有一些周围的线。

标签: c


【解决方案1】:

可以这样使用:

int a=!!(flag & FLAG1);

如果flag & FLAG1 计算结果为0,则a 将被分配0。如果flag & FLAG1 计算结果为另一个值,则a 将被分配1。

【讨论】:

  • 这是有道理的。谢谢。
【解决方案2】:

如果没有更多上下文,很难知道作者这样做的原因,但最常见的是它将值转换为 0 或 1。如果您使用的是 __builtin_expect(),这将特别有趣,其中是的,它可能会产生更好的优化代码。

它有时也用于使代码更具自我记录性……如果您看到它,您就会知道您应该将其视为真/假。通常,当这样使用时,它是宏的一部分。

还值得注意的是,无论原始类型如何,结果都是int。这通常并不重要,但有时很重要。

【讨论】:

    【解决方案3】:

    !! 转换为相反的布尔值,然后再转换回来。第一个逻辑运算符将任何返回值转换为相反的布尔值,然后第二个逻辑运算符将相反的值转换回来。

    例如:

    bool b = !!(flag & FLAG1);
    

    flag & FLAG1 返回值转换为布尔值。

    除非你想混淆你的源代码,否则不要使用这种语句。相反,您可以使用正常的转换来清楚地表达您想要做什么

    bool b = (bool)(flag & FLAG1);
    

    【讨论】:

    • 你从来没有解释过使用!!的原因。
    • 值将是 0 或 1,但 ! 的结果是 int,而不是 _Bool
    • @klutt 他的意思是 OP 在 if 之后没有 ( 是非法的。应该写成if (!!(flag & FLAG1))
    • 更重要的是,当分配给 int 时,它将是 01,并且没有其他值。这对于main 函数很有用,其中退出代码模256 是shell 返回值;从 main 返回 256 与返回 0 相同,当非零表示错误时,这是​​不希望的。
    猜你喜欢
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2020-10-03
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多