!! 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)
将产生0
或1
,而(!!up + !!left)
将产生0
、1
或2
。
【参考方案1】:
是的,这是两个不。
!!a
是 1
如果 a
是非零和 0
如果 a
是 0
您可以将!!
视为对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 ”的解决方法