为什么我的文字不能打印?

时间:2013-07-31 14:58:39

标签: c printing int

为什么在这种情况下没有调用printf()?在这种情况下我们可以使用&&还是什么?

{ 
   int zz1,zz2;
   zz1 = 8;
   zz2= zz1 / 2;
   if ( (zz1==! 0 ) && (zz2 ==! 1 ) ){
      printf("!!!!!!!!!!");
   }
}

4 个答案:

答案 0 :(得分:1)

我想你会写(zz1 != 0 ) && (zz2 != 1 )

实际上(zz1 == !0 ) && (zz2 == !1 )是一种有效的语法,但在这种情况下,由于您正在编写,它会产生不需要的结果:

  1. zz1 equals to (not)0 AND zz2 equals to (not)1
  2. 那是zz1 equals to 1 AND zz2 equals to 0
  3. 这是假的,因此printf不会被称为

答案 1 :(得分:1)

==!不是单个运算符,但实际上它被解析为两个运算符==!,因为编译器总是选择最长的标记。而zz1==!0实际上是zz1 == !0

注意:!0是逻辑 - 非零,即: ==> 1.

条件是条件:

  1. zz1 == !0 ==> zz1 == 1 ==> 8 == 1 ==> False0
  2. 0 && any expression ==> False(根据short-circuit evaluation)。
  3. 因此,如果condition为false,则不会调用printf。
  4. 如果在else子句中添加printf,那么将执行。检查@ ideone

    此外,假设您将&&替换为||,即使这样,您的代码也不会调用printf()函数,因为zz2 = 4zz2 ==! 1 == > zz2 == !1 ==> zz2 == 0 ==> 4 == 0 ==> 0.

    并且0 || 0 == 0所以如果条件是假的。

答案 2 :(得分:0)

也许你想写(zz1 != 0) && (zz2 != 1)

答案 3 :(得分:0)

从语法上讲,您的代码是正确的。

zz1 ==! 0 //This is syntactically correct and evaluates to 0, zz1 has the value 4
//4 == 1 evaluates to false ==> 0

它的计算结果为0,因为您要将zz1与(!0)进行比较。 !0的计算结果为1.同样!1的计算结果为0.这不是按位NOT运算。这是合乎逻辑的。

!9 == !1 == 0.

要执行按位NOT运算,请改用“〜”标记。

~1 == -2
~0 == -1

C中'不等于'的运算符是'!='。要使代码正常工作,请更改==!到!=

运营商&&执行逻辑AND操作 在这段代码中

(zz1 != 0 ) && (zz2 != 1)

检查第一个条件表达式。当且仅当它为真时,将检查下一个条件表达式。 如果第一个表达式(zz1!= 0)为false,则整个表达式的值将减少为0.