Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果(!(!x)&;x),请解释此声明说明了什么_C - Fatal编程技术网

C 如果(!(!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)

如果(!(!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)
如果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