为什么printf()
在这种情况下不会调用?在这种情况下我们可以使用&&
还是什么?为什么我的文字不能打印?
{
int zz1,zz2;
zz1 = 8;
zz2= zz1/2;
if ((zz1==! 0) && (zz2 ==! 1)){
printf("!!!!!!!!!!");
}
}
为什么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) && (zz2 != 1)
?
==!
不是一个操作符,而是其实际解析为两个运算符==
和!
,因为编译器总是选择最长的令牌。而zz1==!0
实际上是zz1 == !0
。
注:!0
是逻辑NOT零是:==> 1.
的代码,如果条件为:
zz1 == !0
==>zz1 == 1
==> 8 == 1 ==>False
or 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
所以如果条件将是错误的。
从句法上看,你的代码是正确的。
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.
检查您的语法'(zz1 ==!0)'您从哪种编程语言中获得? – karthikr
@karthikr是'== ZZ 1!0' =>'== ZZ 1!0' **?** –
Ç,,,,,,,,,,,,,, – user2570509