以下是引用m456m654在2009-10-21 22:59:31的发言:
k=(m=2)||(m=1)&&(m=0);
先看三个括号里的赋值表达式:赋值表达式的结合方向是自右至左,所以上面的语句等价于: k=(2)||(1)&&(0); ,也就是m先被赋值0,后被赋值1,最后是赋值成2,那么m最后就是2了。
然后看逻辑 ...
这个语句的运算顺序,里面有
赋值运算
2级
自右向左
强制运算 15级 自左向右
逻辑或预算
4级
自左向右
逻辑与运算
5级
自左向右
OK。根据以上可得,运算顺序是:
理论的运算顺序:m=2
m=1
m=0
&&运算
||运算
最后逻辑值赋给k
m456的说法很好推翻,(m=2)(m=1)(m=0),这三个式子都是表达式,不是运算符,只有运算符才存在结合性一说,谁说过赋值表达式的结合性是自右向左?
而且,()是强制运算法,结合性是自左向右,如果不计算中间的逻辑运算的话,也要从左到右的依次计算,不是因为“=”的结合性,而是因为“()”的结合性,很明显的,15级比2级大。
再从m456本身的说法上推翻。从右to左运算是吧,那m=0;m=1;m=2;执行后m是2,以m456的思想上面语句也应该是k=k=(2)||(2)&&(2);有的人认为一算,咦,结果还是2,1;恭喜你,我说了,这是以m456自身失误的判断上出发的,本身就有问题,我是用他自己的说法驳倒他的说法,你们可以按m456的思想算算下面的代码
程序代码:
main()
{
int a=0,b=0,c=0;
a=(b=1)||(c=1);
printf("%d,%d,%d",a,b,c);
getch();
}
错误算法:自右向左,c=1,b=1,然后a=1,最后是1,1,1。
实际结果:1,1,0。
大家试试下面的代码,就知道为什么了
程序代码:
main()
{
int b=0,c=0;
(printf("%d",c),b=1),(c=1);
printf("%d,%d",b,c);
getch();
}
上面的论证在我的知识水平认识上,我可以保证是绝对正确的。但下面关于计算机理论算法和实际算法的解释只是我个人观点。
回归k=(m=2)||(m=1)&&(m=0);的算法,我说了
理论算法,但我认为那是计算机在处理时的一个先行思想,计算机理解计算顺序为(m=2)||((m=1)&&(m=0)),但因为||的“潜规则”,计算机又忽略了后面的运算,所以只是算了m=2。
水平有限,我不能用专业的计算机语言描述,我就打个比方
我对m456同学说,我先请你吃饭,再请你看电影,但最后我说你付账。m456就不乐意了,所以后面的条件(m456付账)把前面的都给否定了。我觉得(m=2)||((m=1)&&(m=0))这个式子就相当于(最后说你付账)||((首先请你吃饭)&&(然后请你看电影)),说法(理论运算)上是先请吃饭,后看电影,但因为你付账的关系,结果就是:
实际我没付账,饭没吃,电影没看
对应逻辑关系就是:
真,假,假(因为我要m456付账的目的就是我不付账,所以我成功了为真;而请m456吃饭的目的就是去吃饭,但因为前面的付账问题失败了,为假)
哇,终于说完了