需要帮助理解这个逻辑表达式!! i +!j

时间:2012-07-16 23:37:43

标签: c

  

可能重复:
  double negation in C : is it guaranteed to return 0/1?

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

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

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

3 个答案:

答案 0 :(得分:7)

C没有布尔类型(好吧,C99和更新版本,但程序中没有任何内容可以使用它)。

!只是一个一元运算符,可将0转换为1,将其他任何内容转换为0。因此,在您的情况下,由于i2!i0!!i1j1,因此!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;
}

答案 1 :(得分:2)

如果!x为真(即不等于0),则

x为0;如果x为假(即等于0),则为{1>。由于您的示例i为2,!i将为0,因此!!i将为1.同样!j将为0.因此表达式的结果将为{{ 1}}。

请注意,1 + 0 = 1(即false + false)不等于1。

答案 2 :(得分:0)

以下是规范关于!运算符的说明(C99§6.5.3.3/ 5)。简洁的最后一句是了解其行为所需的全部内容:

  

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

     

结果的类型为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