什么是 "!!" 在C?

0x9*_*x90 38 c gcc boolean boolean-expression

我遇到了以下代码段:

pt->aa[!!(ts->flags & MASK)] = -val;
Run Code Online (Sandbox Code Playgroud)
  1. 什么!!(双惊叹号/感叹号/两个非操作符)代表c?
  2. 不是(!!NULL) == NULL吗?

Jan*_*Jan 59

!是否定的.所以!!否定否定.重要的是结果将是一个int.

  • !!x如果x == 0!!0,就是!1这样0.
  • !!x如果x != 0!!(!0),那!!1就是!0,那就是1.

!! 如果要将任何非零值转换为1,同时确定0仍为0,则通常使用.

事实上,!!NULL == NULL由于!!NULL == !!0!!0 == !1最后!1 == 0.

因此,在您引用的短代码中,0如果括号中的表达式的值是NULL,则数组下标将是,1否则.

  • 如果`NULL`为'0`,则`(!! NULL)== NULL`为真.如果`NULL`是,比方说,`((void*)0)`,你可能得到一个指向整数的比较警告.使用`!!`的全部意义是将"truey"和"falsy"表达式结果转换为整数. (8认同)
  • @SandyLee:不太好.`!! false`是'0`,`!! true`是'1`. (3认同)
  • 结果值是`int`的'0`或`1`. (2认同)
  • 关于NULL的位是不正确的...除了警告(void *)以外,还有可能(但非常少见)有一台计算机,其中空指针的值非零,因此C标准允许NULL为任何值,例如,可以为(void *)INT_MAX,这会使您的语句为假。我不确定在这样的系统上不能正确运行的C代码百分比,但是没有必要鼓励人们做出非标准的假设并编写更多非标准的代码。 (2认同)

unw*_*ind 23

通常(ab)用于int通过重复应用布尔运算符来将任何值转换为s 0或1 !.

例如:!56是0,因为当被视为布尔值时56是"真".这意味着!!56是1,因为!0是1.


oua*_*uah 7

!EE == 0这样的!!E是一样的(E == 0) == 0.!!用于标准化布尔值.