!! c 运算符,是否两个?

Posted

技术标签:

【中文标题】!! c 运算符,是否两个?【英文标题】:!! c operator, is a two NOT?!! c 运算符,是不是两个? 【发布时间】:2012-05-05 15:25:41 【问题描述】:

我读到这个code,并且有这行

 switch (!!up + !!left) 

什么是!! 运算符?两个逻辑非?

【问题讨论】:

是的。听起来写这篇文章的人都不太清楚自己在做什么。 您是否想过,您知道,尝试一下并找出答案? @SauceMaster:恰恰相反。双重不技巧经常使用。 Linux 内核源代码有一些用途,我很确定内核黑客知道他们在做什么。 这是逻辑是运算符。 @weston (up || left) 将产生01,而(!!up + !!left) 将产生012 【参考方案1】:

是的,这是两个不。

!!a1 如果 a 是非零和 0 如果 a0

您可以将!! 视为对0,1 的钳制。我个人认为这种用法是一种看起来很花哨的错误尝试。

【讨论】:

不要与难以摆脱的双结混淆。 与其说是“钳制”,不如说是“规范化”。 如果你不喜欢,你更喜欢什么? (_Bool)(或 (bool),如果已包含 stdbool.h)适用于 C99,但它似乎无缘无故地依赖于 C99,而且我发现了解 cast-to-bool 工作原理的人比了解 !! 成语要少得多。另一种选择,expr?1:0,只是丑陋且无缘无故地冗长。 “表现得很花哨”?【参考方案2】:

你可以这样想象:

!(!(a))

如果你一步一步做,这是有道理的

result = !42;    //Result = 0
result = !(!42)  //Result = 1 because !0 = 1  

这将返回带有任意数字(-42、4.2f 等)的 1,但只有 0 才会发生这种情况

result = !0;    //Result = 1
result = !(!0)  //result = 0

【讨论】:

【参考方案3】:

!!(_Bool) 的更便携(C99 之前)的替代品。

【讨论】:

【参考方案4】:

你是对的。这是两个不。要了解为什么要这样做,请尝试以下代码:

#include <stdio.h>

int foo(const int a)

    return !!a;


int main()

    const int b = foo(7);
    printf(
        "The boolean value is %d, "
        "where 1 means true and 0 means false.\n",
        b
    );
    return 0;

它输出The boolean value is 1, where 1 means true and 0 means false.,但是如果你放弃!!,它输出The boolean value is 7, where 1 means true and 0 means false.

【讨论】:

以上是关于!! c 运算符,是否两个?的主要内容,如果未能解决你的问题,请参考以下文章

运算符

检查两个数学表达式是不是等价

Python中使用逻辑与运算符“and”判断两个比较条件是否满足时编辑器提示“Simplify chained comparison ”的解决方法

正经学C#_布尔运算[布尔值与其布尔运算符]:《c#入门经典》

C++ 中相等运算符中两个 = 之间的空格是不是合法?

C/C++编程知识:运算符丨按位运算符,知识点详解