C语言的小问题

# include <stdio.h>
main ()
{
int a=1,b=2,m=0,n=0,k;
k=(n=b>a)||(m=a);
printf ("%d,%d,%d\n",k,m,n);
}

编译后输出的值是1,0
我不明白为什么M得值是0 (m=a)那里不是已经把a的值赋给m了么?
如果说判断中不算的话,为什么n的值是1?

这就是C语言中著名的“短路原则”问题。
所谓短路原则就是,在&&运算和||运算中,若能提前算出整个表达式的值,则第二个乃至后面所有表达式都不需要运算了。举例:
int a=1,b=2,m=0,n=0,k
k=a||(b=0); //k的值很明显就是1(当看到第一个表达式a时,1或上任何值都得1),因此b=0这个表达式就不需要运算,也就是b没有被赋值为0.
k=m&&(n=1); //k的值很明显就是0(当看到第一个表达式m时,0与上任何值都得0),因此n=1这个表达式就不需要运算,也就是n没有被赋值为1.
同理: k=m&&(n=1)&&...&&....&&...;//从n=1开始后面全部表达式都不需要计算了(||运算也同理)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-10
在C中,||运算符是看两个表达式中是否至少有一个为正确,如果第一个为正确就不会管第二个是否正确,所以m=a不会被运行,因此m依然是0。
比较运算符的优先级高于赋值运算符。在C中,true为1,false为0。因此b>a的结果为1,而这个值被赋予了n。
在C中尽量避免被运算符牵着鼻子走的情况,尽可能把它们用括号分开,以避免不必要的混乱。
第2个回答  2009-05-10
是这样的
来看这句
k=(n=b>a)||(m=a)
执行过程如下
首先当然算括号里面的
b>a的结果为1
然后n=1
因为'||'运算符左边为1 整个表达式必然为真
不去执行m=a //这个也就是所谓的 短路现象
直接k=1
输出自然而然你就明白了本回答被提问者采纳
第3个回答  2009-05-10
系统在执行“或”运算符是如果前面的表达式的只是ture或非0则后面的表达式就不计算了~应为或运算符只有个为真其整个表达式就为真~~同理与运算的只要前一个表达式为假则整个表达式为假~也不计算后面的表达式故为0

参考资料:谭浩强《C语言程序设计》

第4个回答  2009-05-10
k=(n=b>a)||(m=a)
||是一个逻辑运算符,意思是前面一个表达式或后面一个表达式值为非零就执行后面的printf;其中(m=a)不是赋值,是比较,而且值为零。
相似回答