hyqd.net
当前位置:首页 >> 设有:int A=1,B=2,C=3,D=4,m=2,n=2;执行(m=A>B)&&A... >>

设有:int A=1,B=2,C=3,D=4,m=2,n=2;执行(m=A>B)&&A...

这是逻辑运算,n的值为2 (m=a>b) 是赋值表达式,若a大于b则m得真,否则m得假. a=1,b=2, a>b 为假,故 m=假.赋值表达式(m=a>b)为假.m=0.在逻辑与&&运算中,如果第一个操作数为假,则结果是假,后面的操作数不参与运算,本

n=2,短路原则

m=a>b=false x&&y当x为false时y不执行 所以 n=2

先求m = (a > b) = false = 0,足以判断(m=a>b)&&(n=c>d) = false,所以不在计算n = (c > d)的值,故n保持原来的值2不变.

执行(n=c>d)后n值为0

m=1,n=0;解释如下,如果ad)进行处理,此题因为&&左边的表达式为真(若左边的表达式为假,则此题n=2,),所以会处理&&右边的(n=c>d)这个式子,由以上分析,(c>d)为假,其真值为0,所以n为0.

n的值仍然为2,没有改变!过程:先计算a>b,值为0,赋给m的值为0,表达式m=a>b的值也是0.对于&&逻辑运算,不管后面(n=c>d)的值如何,都不影响(m=a>b)&&(n=c>d)的最终结果,因此,C语言不再对表达式n=c>d进行计算.因而n的值没有改变!!

结果是2.#include<stdio.h>main(){ int a=1,b=2,c=3,d=4,m=2,n=2; (m=a>b)&&(n=c>d); printf("%d",n);}//分析:/*因为是&&运算,所以先看前段.m=a>b,=的优先级小于>,a>b不成立,m=0;在&&运算中,如果出现一边为假的情况下,结果直接为假,后面的语句不会去运算了. */

首先看m=a>b,因为a大于b不成立,于是m=0,由于后面是逻辑与,也就是要两个表达式都为真,结果才为真,显然,现在第一个都已经是假了,大多数c编译器就会阻止后面一个语句的执行,于是,最后的结果就是m=0,其余数字不变

&& 运算时,不一定每个表达式都计算的,根据逻辑与运算规则:有 0 则 0,如果前面的表达式为 0 的话,后面的表达式就计算了,因为无论如何,结果肯定为 0,何必浪费时间,这样可以提高程序效率.这个问题中 (m=a>b) 为0,所以后面的 (n=c>d) 就不计算了,被忽略了.同理,|| 运算时,遇到了结果为 1,后面的表达式就不再计算了.

相关文档
网站首页 | 网站地图
All rights reserved Powered by www.hyqd.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com