lovelive分队:c语言高手进!

来源:百度文库 编辑:中科新闻网 时间:2024/05/07 19:21:59
main()
{int x=3,y=6,a=0;
while(x++!=(y-=1))
{
a+=1;
if(y<x) break;
}
printf("x=%d,a=%d\n",x,y,a);
}

在进行第一次循环后,x=4,y=5,a=1
在进行第二次循环的时候,此时x=5,y=4,a=2.
这里出现了我的问题。
然后在第二次执行 if(y<x) break;语句时,因为(y=4)<(x=5)故break跳出循环
最后printf a是2还是1呢?
----
答案是1,照答案解释的话就是一旦循环跳出,那么在跳出的那次循环 在其循环体中执行的语句全部无效????
我潜意识里面觉得:既然第二次已经进入while循环,那么第二次的 a+=1;也应该执行了一次才行,那么答案就应该是2!

---
先支付10分 有人回答了再追加20分~

第1次执行:
3!=5成立,执行a+=1,a=1,x=4,y=5
第2次执行:
4!=4不成立,没有继续执行循环。
x++是这样的:
先自加1,然后返回先前的值。
附实现(C++的,C内部实现和这个也是相似的)
Type& Type::operator++()//前缀++,++x
{
*this+=1;
return *this;
}
const Type Type::operator++(int)//后缀++,x++
{
Type T=*this;
++(*this);
return T;
}
to 蛮蛮工作室:
单纯的前缀++和后缀++并不会导致不同的结果。之所以有不同的结果,是因为c/c++中某些操作的计算顺序未定义的结果。例如这里的二元关系操作符的操作数的计算顺序是未定义的,所以如果有++x>x的话,是可能导致不同结果的。但是lz这样的表达式并不存在这个问题,计算顺序的不同并不会影响其结果。

那么在跳出的那次循环 在其循环体中执行的语句全部无效????
老兄,你也不想想,如果执行了语句,可能无效么?
如果没有效果出来,你该想它并没有执行语句。思路不能错了。
另外,这的确是一个x++和++x的问题,问题的关键在哪儿呢?这个东西在不同的编译器下结果可能会不一样,因为对于++这个符号,有的机子上是全部扫描后给出运算顺序,有的机子上则不是。如果是学习,这种精神是不错的,如果真要做东西,不要写这样的句子。我相信你总有办法把它的句子写明白,即使长一些,但这是值得的。这样也便于别人看你的程序,维护时候也省了不少时间和精力。

我调试了一下,看到第一次循环是成立的,执行了while语句后,执行a+=1 时,x=4,y=5.之后返回到while语句,而由于x++,是要到a+=1时才执行的,而y-=1是在while语句中执行,所以由于while的条件不成立出来了(x=y=4),原因和二楼说的一样。如果以后不明白类似的问题的话,可以自己用VC中的调试来看一下。

答案是1~在第二次执行 if(y<x) break;语句,y=4)<(x=5)故break跳出循环
说明条件不成立 那么printf a 输出就是1

循环只执行了一次,x++这条语句你没有充分理解,他是先取他的值进行比较后,然后再进行加1的。此时x=4,y=y-1后,y=4,退出循环了,比较完后再讲x变为5。如果你把x++改为++x就会看到你要的效果,输出a=2了

第一次循环是成立的,执行了while语句后,执行a+=1 时,x=4,y=5.之后返回到while语句,而由于x++,是要到a+=1时才执行的,而y-=1是在while语句中执行,所以由于while的条件不成立出来了(x=y=4).