C 如果(!(!x)&;x),请解释此声明说明了什么
如果(!(!x)和&x)C 如果(!(!x)&;x),请解释此声明说明了什么,c,C,如果(!(!x)和&x) #包括 int main(){ int x=5,y=10; 如果(!(!x)&&x) printf(“%d”,x); 其他的 printf(“%d”,y); 返回0; } 如果(!(!x)和&x)等同于如果(!!x和&x) !!如果x为非零,则x为1;如果x为零,则x为0 此外,表达式简化为(!!x),因为和&x是重言式,因为x是非易失性的int类型。但是将值折叠为0或1正是if条件的行为,因此if简化为if(x)在c中,true和false分别为1和0 !(!x)
#包括
int main(){
int x=5,y=10;
如果(!(!x)&&x)
printf(“%d”,x);
其他的
printf(“%d”,y);
返回0;
}
如果(!(!x)和&x)
等同于如果(!!x和&x)
!!如果x
为非零,则x
为1;如果x
为零,则x为0
此外,表达式简化为
(!!x)
,因为和&x
是重言式,因为x
是非易失性的int
类型。但是将值折叠为0或1正是if
条件的行为,因此if
简化为if(x)
在c中,true和false分别为1和0
!(!x)
如果x为零,则(!x)的计算结果为真(1),然后!(true)评估为false
在这种情况下,if语句总是错误的
if(!(!x) && x)
但是,如果x不是零,那么!!x是真的
true && true
您可以使用
if(x)
查看GCC 10.1在上生成的程序集
简而言之,GCC正在将if(!(!x)和&x)
减少到if(x&x)
代码>是not运算符。它将1反转为0,反之亦然。在你的问题中!(!x)
计算为x,因此(!(!x)和&x)
将计算为真实条件,因此x将以C语言打印,非零值视为真实,零(0)视为错误。另一方面,逻辑Not(!)运算符确定某事物的相反方向。例如:在您的代码中,x=5,因此的值!x将为0,因为x=5意味着变量x持有真值。因此,not true=false=0。那么价值呢!(!x)=!(false/0)=非false=true=1。
请记住,逻辑NOT(!)运算符不会更改该值
所以最终!(!x)表示正确。
if(!(!x)&&x)=if(true&&true)=if(true)
这就是为什么要执行if块。尽管true为1,但任何非零值实际上都为true。在C.:-)@LeoSmith中,我在哪里说过只有1是真的?我说的是另一种方式(事实是1):)。从-5
或19331
中可以将其评估为真。只有当x由于&&
的短路特性而不易产生副作用时,它才是真的。如果!!x
是所需的&的1秒部分。在这个简单的示例中,编译器将优化第二个检查。但是,让控制变量不稳定或编译而不优化P_uuj_uu的评论:我想你的意思是,在!!x&x
,&
的第二个操作数不求值,因为我们知道x
是5,所以第一个操作数是真的。说“表达简化”有些误导;表达式不会因单独优化或分析而简化。当考虑到x
的已知值时,表达式实际上可以在编译时优化中减少,但是,如果是这样,它应该完全减少到“true”,而不仅仅是!!x
。
if(x)
xor eax, eax // eax = 0
test edi, edi // perform bitwise & and set Zero, Positive, or Negative flag
sete al // Sets lower 8-bits in eax to 1 if the zero flag is set or to 0 otherwise.
ret