while(x--,x)与while(x,x--)

来源:百度知道 编辑:UC知道 时间:2024/06/16 11:00:14
(1)
int x=1,a=0;
while (x--,x)
{
a+=1;
}
printf ("%d\n",a);

(2)
int x=1,a=0;
while (x,x--)
{
a+=1;
}
printf ("%d\n",a);

为什么第一个结果是0,第二个结果是1?

}
还有
int x=1,a;
a=x--,x;
printf ("%d\n",a);
输出结果却是1

逗号表达式的值由最后一项决定。

while (x--,x)

当X初始值为1时,上面那条语句等价于while (1, 0)= while (0) ,所以并未执行循环之内的语句。 【注意,若是while (--x,x) 的话就等价与 while (0,0)了,注意两者的区别】

while (x,x--)

当X初始值为1时,上面那条语句等价于while (1,1)= while (1) ,所以执行了循环之内的语句。

而a=x--,x; 这条语句,等价于 a=1,0; 但由于逗号的优先级最低,所以上面等价于 (a=x--),x; 整条语句的值是0,但是a却被赋值了1.

没认真看书吧!!!
,符号连成的语句,执行是从左至右,但最终结果取最右的值.

先看第一个
while (x--,x)
(x--,x) 先x--,结果x变为0了,(x--,x)最终值为x的值是0,故while语句不成立,直接输出,a的值为0

再看第二个
while (x,x--)
先x,没影响,(x,x--)值为 x--,x--是先用x的值,再自减,这点知道吧?
所以这个while语句等效与while (x--),会有一次的执行,a的值加了1,所以输出1

最后一个, a=x--,x; 语句,左边,a=x--,a的值为x初值为1,当然最终结果是1了!!

关键就在,逗号运算符,运算从左至右,总表达式最终的值是最右的表达式的值;--运算符,如果变量在前,是先使用变量的值,再让变量自减.

首先逗号运算符“,”的运算顺序是从左到右,并且表达式的值等于运算符右边的表达式的值。
x++的值是x,++x的值是x+1,即如果x=0的话,执行a=x++;后a的值是0,执行a=++x;后a的值是1。

所以当执行到while (x--,x)时,程序首先判断“x--,x”这个表达式的值是否为真。因此程序首先计算x,再将x自减1,再计算x并将x的值作为“x--,x”这个表达式的值,即0,因此直接跳出循环,a=0;