C语言,逻辑运算的例题,答案到底是(B)还是(D),麻烦分析一下。 5
例题2:有以下程序:main(){inti=1,j=2,k=3,a;a=i++==1&&(++j==3||k++==3);printf(“%d%d%d\n”,i,j,k)...
例题2:有以下程序:
main()
{
int i=1,j=2,k=3,a;
a=i++==1&&(++j==3||k++==3);
printf(“%d %d %d\n”,i,j,k);
}
程序运行后的输出结果为 。
(A)1 2 3
(B)2 3 4
(C)2 2 3
(D)2 3 3
解析:a=i++==1&&(++j==3||k++=3);圆括号的优先级最高,先算,++次之、==次之、&&次之、=最低。
再圆括号中:++最高级,==次之,||最低。
j=2,故++j的表达式结果为3,且j=3;k=3,故k++的表达式结果为3,且k=4。
++j==3等价于3==3,为真,而k++==3等价于3==3,为真。
又||要求两边有一个为真即为真,故++j==3||k++==3的结果为真。
i=1,故i++的表达式结果为1,且i=2。
i++==1等价于1==1,为真。
又&&是两边均为真为真,故i++==1&&(++j==3||k++==3)的结果为1。
综上a=1,i=2,j=3,k=4,故答案为选项(B)。
教材上的答案是选项(D)。
其解析的大概意思是:
【||要求一个为真即为真,其结合性为自左向右,如果左边算出来的结果为真,右边的就不用计算,即k++没有执行,也就是说,k依旧为3】
【综上a=1,i=2,j=3,k=3,故答案为选项(D)。】 展开
main()
{
int i=1,j=2,k=3,a;
a=i++==1&&(++j==3||k++==3);
printf(“%d %d %d\n”,i,j,k);
}
程序运行后的输出结果为 。
(A)1 2 3
(B)2 3 4
(C)2 2 3
(D)2 3 3
解析:a=i++==1&&(++j==3||k++=3);圆括号的优先级最高,先算,++次之、==次之、&&次之、=最低。
再圆括号中:++最高级,==次之,||最低。
j=2,故++j的表达式结果为3,且j=3;k=3,故k++的表达式结果为3,且k=4。
++j==3等价于3==3,为真,而k++==3等价于3==3,为真。
又||要求两边有一个为真即为真,故++j==3||k++==3的结果为真。
i=1,故i++的表达式结果为1,且i=2。
i++==1等价于1==1,为真。
又&&是两边均为真为真,故i++==1&&(++j==3||k++==3)的结果为1。
综上a=1,i=2,j=3,k=4,故答案为选项(B)。
教材上的答案是选项(D)。
其解析的大概意思是:
【||要求一个为真即为真,其结合性为自左向右,如果左边算出来的结果为真,右边的就不用计算,即k++没有执行,也就是说,k依旧为3】
【综上a=1,i=2,j=3,k=3,故答案为选项(D)。】 展开
展开全部
逻辑运算符是顺序求值节点,C语言要求它的左表达式被优先求值,其次再根据短路效应决定是否对右表达式求值
逻辑与:当左表达式为真,对右表达式求值,当左表达式为假,结束逻辑表达式
逻辑或:当左表达式为假,对右表达式求值,当左表达式为真,结束逻辑表达式
根据两个规则换算:
a=i++==1&&(++j==3||k++==3);
首先对i++ == 1求值:其结果为真,a=1&&(++j==3||k++==3)
其次对(++j==3||k++==3)求值,对++j == 3求值,结果为真,a=1&&(1 || k++==3)
根据短路效应,不对逻辑或右表达式求值,也就是不执行,逻辑与表达式右值为真
根据上述求值,实际上也就是对i和j进行了计算,而对k没有计算,k值不变
当语句结束,i == 2, j == 3, k == 3
逻辑与:当左表达式为真,对右表达式求值,当左表达式为假,结束逻辑表达式
逻辑或:当左表达式为假,对右表达式求值,当左表达式为真,结束逻辑表达式
根据两个规则换算:
a=i++==1&&(++j==3||k++==3);
首先对i++ == 1求值:其结果为真,a=1&&(++j==3||k++==3)
其次对(++j==3||k++==3)求值,对++j == 3求值,结果为真,a=1&&(1 || k++==3)
根据短路效应,不对逻辑或右表达式求值,也就是不执行,逻辑与表达式右值为真
根据上述求值,实际上也就是对i和j进行了计算,而对k没有计算,k值不变
当语句结束,i == 2, j == 3, k == 3
展开全部
D)正确,选D)。教材上的分析正确——k++没有执行的原因是||前面的++j==3已经成“真”,||后面就没有必要执行了,俗称||的短路现象。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
运算符的优先级和表达式的求值顺序是两个不同的概念,两者没有直接关系。“圆括号的优先级最高,先算”解析从这一句话开始就是错误的,故之后的内容可以无视。
&&运算符是一个顺序点,在程序经过顺序点时,之前的所有表达式必须已经求值完毕,它们的副作用必须已经发生。因此一定是先对&&之前的表达式i++==1求值。这个表达式求值结果为真,求值完毕后i变为2。由于&&左边的表达式为真,还需要进一步对右边的表达式求值,接下来就是求子表达式++j==3||k++==3的值。
||运算符同样是一个顺序点,因此一定是先对++j==3求值。这个表达式的求值结果同样为真,求值完毕后j变为3。由于运算符||左边的表达式为真,整个或运算结果一定为真,发生短路运算,不再计算右边的表达式k++==3。因此k的值不会发生变化,为初始值3。
因此,最终i=2,j=3,k=3。教材答案正确,但解析错误。
&&运算符是一个顺序点,在程序经过顺序点时,之前的所有表达式必须已经求值完毕,它们的副作用必须已经发生。因此一定是先对&&之前的表达式i++==1求值。这个表达式求值结果为真,求值完毕后i变为2。由于&&左边的表达式为真,还需要进一步对右边的表达式求值,接下来就是求子表达式++j==3||k++==3的值。
||运算符同样是一个顺序点,因此一定是先对++j==3求值。这个表达式的求值结果同样为真,求值完毕后j变为3。由于运算符||左边的表达式为真,整个或运算结果一定为真,发生短路运算,不再计算右边的表达式k++==3。因此k的值不会发生变化,为初始值3。
因此,最终i=2,j=3,k=3。教材答案正确,但解析错误。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
--你直接用程序写出来执行一下就知道谁对谁错了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询