!c运算符,是两个不是吗?

Jua*_*blo 24 c operators logical-operators

我读这段代码,并有这条线

 switch (!!up + !!left) {
Run Code Online (Sandbox Code Playgroud)

什么是!!运营商?两个逻辑不?

Arm*_*yan 38

是的,这是两个不值得的.

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

您可以将其!!视为夹紧{0,1}.我个人觉得这种用法很难看起来很花哨.

  • 不要混淆双结,这很难摆脱. (14认同)
  • 如果你不喜欢它,你更喜欢什么?`(_Bool)`(或`(bool)`如果包含`stdbool.h`)适用于C99,但它似乎无偿地依赖于C99,我发现很少有人理解cast-to-bool的工作原理比理解`!!`成语.另一种选择,`expr?1:0`,只是丑陋和无偿的冗长. (7认同)
  • 它不像"正常化"那样"夹紧". (4认同)

Rod*_*igo 7

你可以想象它是这样的:

!(!(a))
Run Code Online (Sandbox Code Playgroud)

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

result = !42;    //Result = 0
result = !(!42)  //Result = 1 because !0 = 1  
Run Code Online (Sandbox Code Playgroud)

这将返回1任何数字(-42,4.2f等),但只有0,这将发生

result = !0;    //Result = 1
result = !(!0)  //result = 0
Run Code Online (Sandbox Code Playgroud)


R..*_*R.. 6

!!是一种更便携(前C99)的替代品(_Bool).