请教C语言的题!

来源:百度知道 编辑:UC知道 时间:2024/05/19 19:36:31
1.写出以下程序的输出结果______.
main()

{
int x=-1,y=5,z=6,k;

K=x++>=0&&!(y--<=0)||(z=x+y);

printf("%d,%d,%d,%d\n",k,x,y,z);
}

此题在书上的答案是1,0,5,5 .可我怎么算也不得那么多!郁闷
请看我矛盾的思路吧,看到这句 K=x++>=0&&!(y--<=0)||(z=x+y);
应该先算第一个括号里的吧.y--<=0不成立 值为0,这步运算完了,y就减1了吧,y=4,然后再算第二个括号里的z=x+y,于是z=-1+4,z=3,可z的正确答案却是5!不知哪里想错了!!!请指教!!!接下来就轮到前面x++>=0了,不成立值为0,这步运算完了,x就自增加1了,所以x=-1+1,x=0.这步答案算对了不知是不是巧合!最后就剩下 0 && !0 || 0 , !0就是1吧 ,所以k=0&&1||0 值为0.

之所以写上面那一堆,是想让各位看看我都进入了哪些误区,如果看不下去就直接告诉我正确的思路和过程吧!最好详细点!谢谢了!!

书上的答案没有错,我运行了一下,结果也是1,0,5,5
有一个误区是z=x+y的布尔值并不是0,而是1,所有赋值语句的布尔值都是1.0&&1||1=0||1=1,因为&&比||的优先级高。所以k等于1.
我用程序测试,发现x++>=0先判断x是否大于0,再进行++。
我只能解释到这里,后面的不太明白为什么
你可以用程序试试为什么y=5,z=5.

一道题干嘛要用两个问题来提问?

答案给出来了,在:
http://zhidao.baidu.com/question/49742701.html

其实你的式子最前面部分加个括号就容易看得多了!他们是一样的!
K=(x++>=0)&&!(y--<=0)||(z=x+y)

这里第一个=号,&&和||将整个式子划分成四块,根据运算符的优先级,&&和||运算等级相同实行从左到右的运算顺序,而&&运算符是当其左边的运算式为真时(=1),才会执行右边的运算式,因此x++>=0运行后为-1>=0为假,因此不执行y--<=0这句,而执行z=x+y=0+5=5,最后z=0||1=1
k,x,y,z分别为1,0,5,5