| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1620 人关注过本帖, 2 人收藏
标题:关于逻辑表达,不太明白?
只看楼主 加入收藏
anhuizxw
Rank: 1
等 级:新手上路
帖 子:17
专家分:6
注 册:2009-7-12
结帖率:83.33%
收藏(2)
已结贴  问题点数:20 回复次数:26 
关于逻辑表达,不太明白?
#include "stdio.h"
void main()
{
   int m,k;
   k=(m=2)||(m=1)&&(m=0);
   printf("%d,%d",m,k);
}
结果是2,1
不是先看逻辑或,得m=1,再与逻辑与比较,得m=1吗??
搜索更多相关主题的帖子: 逻辑 表达 
2009-10-21 22:38
apwh7550
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:106
注 册:2009-10-17
收藏
得分:3 
C中“=”是赋值操作,“==”才是等号。m为2是你给它赋值为2了
所以你的m=2,m=1,m=0,其实结果都为真(即:1)。故k的值必为1.
2009-10-21 22:43
apwh7550
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:106
注 册:2009-10-17
收藏
得分:2 
补充: k=(m=2)||(m=1)&&(m=0);里边的赋值操作好像是从右向左进行的,不过不太确定。
望知道的朋友给解答下,谢谢!
2009-10-21 22:47
anhuizxw
Rank: 1
等 级:新手上路
帖 子:17
专家分:6
注 册:2009-7-12
收藏
得分:0 
回复 2楼 apwh7550
逻辑运算符是自左至右的结合性
2009-10-21 22:52
anhuizxw
Rank: 1
等 级:新手上路
帖 子:17
专家分:6
注 册:2009-7-12
收藏
得分:0 
回复 楼主 anhuizxw
前面的逻辑或是真,m=1,但后面的逻辑与是假呀,m不应该为0吗?
2009-10-21 22:53
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
收藏
得分:2 
k=(m=2)||(m=1)&&(m=0);
先看三个括号里的赋值表达式:赋值表达式的结合方向是自右至左,所以上面的语句等价于: k=(2)||(1)&&(0); ,也就是m先被赋值0,后被赋值1,最后是赋值成2,那么m最后就是2了。
然后看逻辑运算符:其中&&的优先级比||高,所以先看1&&0,结果为假,0;此结果跟||连在一起就是k=2||0,为真,所以k=1.
2009-10-21 22:59
apwh7550
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:106
注 册:2009-10-17
收藏
得分:0 
明白了。6楼说的很清楚,谢谢!

[ 本帖最后由 apwh7550 于 2009-10-21 23:04 编辑 ]
2009-10-21 23:01
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:2 
,我来说一下。
k=(m=2)||(m=1)&&(m=0); /* 开始2赋给m,m值为2,m非零即真,||或成立,||或后的表达式没算到. */
   printf("%d,%d",m,k); /* 结果m值是2,k值是1 */

努力—前进—变老—退休—入土
2009-10-21 23:15
無邪的睡脸
Rank: 2
等 级:等待验证会员
威 望:1
帖 子:344
专家分:13
注 册:2007-9-11
收藏
得分:1 
与结合性无关,短路求值,楼上正解
2009-10-21 23:19
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:3 
- -实践出真知
楼上的几位虽然在结果上都对了,但关于优先级、结合性、||和&&两种运算符的“潜规则”没弄清楚。
按你们自己的想法算下下面的程序

#include "stdio.h"
void main()
{
   int m=-1,k=-1,a=-1,b=-1;
   k=((m=1)||(b=0)&&(a=1));
   printf("%d,%d,%d",m,k,a,b);
   getch();
}
然后在看看编译结果,很可能有出入。
如果是一样的,也说明的另外一个问题,你们解答问题和你们想表达的不一样
补充下:
k=(m=2)||(m=1)&&(m=0);是计算方法是
k=((m=2)||((m=1)&&(m=0)))
与结合性优先级还有潜规则都有关系,不是user说的先算的m=2(理论算法的确是先m=2,但中间有一个判断该不该用潜规则的过程)。也不仅仅是楼上版主说的短路。
因为user没说明详细的思路,我还不能推翻,但m456我概念肯定是错的
分别试试m b a
        0 0 1
        0 1 0
        0 1 1
        1 0 0
        1 0 1
        1 1 0
很明显的得出你们的思路有问题

[ 本帖最后由 pgy 于 2009-10-22 03:43 编辑 ]

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



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

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