| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1620 人关注过本帖, 2 人收藏
标题:关于逻辑表达,不太明白?
只看楼主 加入收藏
jiangwu10057
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:341
专家分:667
注 册:2009-3-25
收藏
得分:2 
我说说我的吧
我认为
m先被0赋值再被1赋值最后被2赋值   (右结合) k=(m=2)||(m=1)&&(m=0);
所以k=(2)||(1)&&(0)由于优先级问题先进行&&(这个也有小规则不过在这用不上)
所以k=(2)||(0)  或这个运算符有个小规则前面为真后面不考虑了(不等于o即为真)
所以k=1


我是来发表见解,错了请指出谢
2009-10-22 06:25
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
回复 10楼 pgy
小MM,你都知道怎么用代码测试了,还不能有个定论?
程序代码:
void main()
{
   int m=-1,k=-1,a=-1,b=-1;
   k=((m=1)||(b=0)&&(a=1));
   printf("m=%d,k=%d,a=%d,b=%d\n",m,k,a,b);
   getch();
}
你运行你的代码会输出什么?
输出结果:
m=1,k=1,a=-1,b=-1
给出的结果很明显'||'或后的表达式没算到。

努力—前进—变老—退休—入土
2009-10-22 09:13
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
回复 12楼 UserYuH
呵呵,你的结果还是对的,就是想知道你是怎么计算的,直接算左边第一个式子,为真,然后因为逻辑或所以后面不算了?
这个思想没错,但只是一部分。

我可好玩啦...不信你玩玩^_^
2009-10-22 09:18
mgmt_asp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:124
专家分:158
注 册:2009-7-26
收藏
得分:0 
分歧出真知,坚持坚持..
2009-10-22 09:22
beyond_one
Rank: 4
等 级:业余侠客
帖 子:61
专家分:206
注 册:2009-6-26
收藏
得分:0 
6楼的是正解!
2009-10-22 09:31
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:3 
以下是引用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吃饭的目的就是去吃饭,但因为前面的付账问题失败了,为假)
哇,终于说完了

我可好玩啦...不信你玩玩^_^
2009-10-22 10:30
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
回复 12楼 UserYuH
虽然最后实际运算是那样,但中间我觉得应该有一个“判断过程”。而不是“显然可得”,因为计算机可不会从3,1,2中一眼看出最小的就是1

我可好玩啦...不信你玩玩^_^
2009-10-22 10:33
zqb7899
Rank: 4
等 级:业余侠客
帖 子:159
专家分:238
注 册:2009-10-16
收藏
得分:0 
2009-10-22 11:10
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
回复 17楼 pgy
小MM,刚大哥在玩捉虾,没看到你长篇大论,也说得很乱呀。||或就是:只要判断左边成立就为真,右边的不再做判断,没有什么中间判断过程,这个小问题就不用讨论了,我请你看电影,吃爆米花。我付帐

努力—前进—变老—退休—入土
2009-10-22 12:51
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
are you sure?

我可好玩啦...不信你玩玩^_^
2009-10-22 13:03
快速回复:关于逻辑表达,不太明白?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024186 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved