1

可能重复:
C 中的双重否定:是否保证返回 0/1?

int main(void)
{
  int i = 2, j = 1;

  printf("%d", !!i +!j);
  return 0;
}

据我了解,!!将表达式转换为布尔值,所以它是说因为 i 不等于 2 值是 0 + j 不等于 1 值是 0,并且由于 0 等于 false 它读取: false + false = true which代表1的值。请帮助我是C编程的新手。

4

3 回答 3

7

C 没有布尔类型(好吧,C99 和更新版本有,但您的程序中没有使用它)。

!只是一个一元运算符,它变成01其他任何东西变成0. 所以在你的情况下,因为iis 2!iis0!!iis 1j1,所以!j0。剩下!!i + !j的就是1 + 0,你正在打印1。试试这个示例程序来看看它的实际效果:

#include <stdio.h>

int main(void)
{
    int i = 2, j = 1;

    printf("i = %d, j = %d\n", i, j);
    printf("!i = %d, !!i = %d\n", !i, !!i);
    printf("!j = %d\n", !j);
    printf("!!i + !j = %d + %d = %d\n", !!i, !j, !!i + !j);
    return 0;
}
于 2012-07-16T23:39:44.410 回答
2

!x如果x为真(即不等于 0)则为 0,如果x为假(即等于 0)则为 1。由于您的示例i为 2,因此将为!i0,因此!!i将为 1。同样!j为 0。因此表达式的结果将为1 + 0 = 1

请注意,在任何情况下0 + 0(即 false + false)都不会等于 1。

于 2012-07-16T23:40:24.900 回答
0

以下是规范中关于!运营商的说明(C99 §6.5.3.3/5)。简洁的最后一句话是理解其行为所真正需要的:

逻辑否定运算符的结果!0如果其操作数的值比较不等于01如果其操作数的值比较等于0

结果有类型int

表达式!E等价于(0==E)

我们可以使用第三句的转换来评估您的表达式,!!i + !j。变换变为:

(0 == (0 == i)) + (0 == j)

我们可以如下评估它:

(0 == (0 == 2)) + (0 == 1) // substitute the variable values
(0 == (0     )) + (0 == 1) // 0 == 2 is false, so it becomes 0
(0 == (0     )) + (0     ) // 0 == 1 is false, so it becomes 0
(1            ) + (0)      // 0 == 0 is true, so it becomes 1
 1                         // 1 + 0 is 1
于 2012-07-16T23:42:09.707 回答