2013-06-25 43 views
0
#include<stdio.h> 
main() 
{ 
    int x=10,y=20; 
    if(!(!x)&&x) 
     printf("x=%d\n",x); 
    else 
     printf("y=%d\n",y); 
    return 0; 
} 

输出是10.怎么样? 请在每一步显示x的值。解释程序的输出

+0

你应该输出不代码相匹配。 –

+3

“请在每个步骤中显示x的值” - 请阅读常见问题解答。 **你**应该在每一步显示x的值。如果你弄错了,我们可以指出。 –

+0

'!'操作符返回0,除非它的参数为0,在这种情况下返回1.因此,如果'x'为0,'!! x'返回0,否则返回1。 '1 && 10'的结果是1或者真,因此第一个'printf()'被执行。 –

回答

0
(!x) ==> (!10) ==> 0 
!(0) ==> 1 
1 && 10 ==> 1 

所以你会得到声明printf("x=%d\n",x);被执行。

2

!x值是0然后!(!x)1这是真的,因此它打印在x=10if()(1 && 10)条件变为真。

3

(!x)是一个布尔值,用于检查x是否为零,如果其操作数不为零则产生零,如果其操作数为零则产生一个。 if(!(!x))相当于if(x),因为它反转了!x这是x的倒数值。该结果与&&运营商的x的结果相结合。由于两个条件都为真,则如果块被执行

+0

(!(!x))相当于x ????? –

+0

在布尔意义上 –

+0

我的意思是'如果(!(!x))'等于'if(x)' –

0

由于x为10,

!x=0

!(!x)=1

1&&10为真

因此打印x,即10

7

首先,操作员预先cedence如下

() > ! > && 

现在,解决基于上述优先

1. (!x) = 0 
2. !(!x) = !(0) = 1 
3. (1 && 10) = 1// hence, true. 
4. hence, print x = 10 
+1

+1提到优先级,这是至关重要的。 – Jens

+0

也来自我的一方。 – 0decimal0

+0

@Jens当然,但是期望二元运算符比一元运算符更紧密地结合会更奇怪,甚至更奇怪的是它会跨越父元素并且比内部运算符更紧密地结合。 –