为什么在这种情况下没有调用printf()
?在这种情况下我们可以使用&&
还是什么?
{
int zz1,zz2;
zz1 = 8;
zz2= zz1 / 2;
if ( (zz1==! 0 ) && (zz2 ==! 1 ) ){
printf("!!!!!!!!!!");
}
}
答案 0 :(得分:1)
我想你会写(zz1 != 0 ) && (zz2 != 1 )
。
实际上(zz1 == !0 ) && (zz2 == !1 )
是一种有效的语法,但在这种情况下,由于您正在编写,它会产生不需要的结果:
zz1 equals to (not)0 AND zz2 equals to (not)1
zz1 equals to 1 AND zz2 equals to 0
printf
不会被称为答案 1 :(得分:1)
==!
不是单个运算符,但实际上它被解析为两个运算符==
和!
,因为编译器总是选择最长的标记。而zz1==!0
实际上是zz1 == !0
。
注意:!0
是逻辑 - 非零,即: ==> 1.
条件是条件:
zz1 == !0
==> zz1 == 1
==> 8 == 1 ==> False
或0
0
&&
any expression
==> False
(根据short-circuit evaluation)。如果在else子句中添加printf,那么将执行。检查@ ideone
此外,假设您将&&
替换为||
,即使这样,您的代码也不会调用printf()函数,因为zz2 = 4
和zz2 ==! 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.