在这种情况下为什么printf()
不打电话?我们可以&&
在那种情况下使用吗?
{
int zz1,zz2;
zz1 = 8;
zz2= zz1 / 2;
if ( (zz1==! 0 ) && (zz2 ==! 1 ) ){
printf("!!!!!!!!!!");
}
}
我想你会写(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
不叫==!
不是单个运算符,而是实际上被解析为两个运算符==
,!
因为编译器总是选择最长的标记。而zz1==!0
实际上是zz1 == !0
。
注意:!0
是逻辑非零,即:==> 1。
if条件的代码是:
zz1 == !0
==> zz1 == 1
==> 8 == 1 ==> False
或 0
0
&&
any expression
==> False
(根据短路评估)。如果您在 else 子句中添加 printf ,那么它将执行。检查@ ideone。
此外,假设如果您替换&&
为||
即使那样 printf() 函数也不会在您的代码中调用,因为zz2 = 4
== zz2 ==! 1
> zz2 == !1
==> zz2 == 0
==> 4 == 0
==> 0。
所以0 || 0 == 0
如果条件为假。
也许你想写(zz1 != 0) && (zz2 != 1)
?
从语法上讲,您的代码是正确的。
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。