2013-07-31 103 views
-2

为什么printf()在这种情况下不会调用?在这种情况下我们可以使用&&还是什么?为什么我的文字不能打印?

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

检查您的语法'(zz1 ==!0)'您从哪种编程语言中获得? – karthikr

+0

@karthikr是'== ZZ 1!0' =>'== ZZ 1!0' **?** –

+0

Ç,,,,,,,,,,,,,, – user2570509

回答

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不叫
0

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

1

==!不是一个操作符,而是其实际解析为两个运算符==!,因为编译器总是选择最长的令牌。而zz1==!0实际上是zz1 == !0

注:!0是逻辑NOT零是:==> 1.

的代码,如果条件为:

  1. zz1 == !0==>zz1 == 1==> 8 == 1 ==>False or 0
  2. and 0&&any expression==>False(根据short-circuit evaluation)。
  3. 所以如果条件为false并且printf不会被调用。

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

此外,假设如果更换由||&&即使再printf()函数将不会在你的代码中调用,因为zz2 = 4zz2 ==! 1==>zz2 == !1==>zz2 == 0==>4 == 0= => 0.

0 || 0 == 0所以如果条件将是错误的。

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中'不等于'的运算符是'!='。要使您的代码正常工作,请更改==!到!=

操作& &执行逻辑与操作。
在一段代码

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

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