-2

在这种情况下为什么printf()不打电话?我们可以&&在那种情况下使用吗?

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

4 回答 4

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不叫
于 2013-07-31T15:01:46.207 回答
1

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

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

if条件的代码是:

  1. zz1 == !0 ==> zz1 == 1 ==> 8 == 1 ==> False0
  2. 0 && any expression ==> False (根据短路评估)。
  3. 因此,如果条件为假并且 printf 将不会被调用。

如果您在 else 子句中添加 printf ,那么它将执行。检查@ ideone

此外,假设如果您替换&&||即使那样 printf() 函数也不会在您的代码中调用,因为zz2 = 4== zz2 ==! 1 > zz2 == !1 ==> zz2 == 0 ==> 4 == 0 ==> 0。

所以0 || 0 == 0如果条件为假。

于 2013-07-31T15:06:29.770 回答
0

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

于 2013-07-31T15:03:54.483 回答
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 运算。这是逻辑NOT。

!9 == !1 == 0.

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

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

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

运算符 && 执行逻辑与运算。
在这段代码中

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

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

于 2013-07-31T16:17:53.803 回答