一道简单的逻辑运算题

逻辑或运算的简单例题"||"

题目

若有变量声明如下: int x =5,y = 7,z = 8; 执行表达式:z += x++||y++||++z;后,x,y,z 的值分别是( )。 A.6,7,9 B.6,8,10 C.6,8,8 D.6,8,1

解析

题目解析如下 答案:A  解析:首先我们要知道逻辑或运算“||”具有短路运算的性质,即在判断“||”左右两侧的式子时,一般来说顺序是依次从左往右执行的,但由于短路运算性质,如果“||”左侧的式子为真,那么该逻辑或运算返回的结果即为左侧这个表达式的值,且“||”右侧的式子便不再继续执行,但是并不是说一个逻辑或右侧其他的运算表达式都不用继续计算了,而是仅当前这个逻辑或运算符“||”两侧的两个表达式所形成的一个结果成为一个新的值,如果右侧还有“||”,则继续按照此原则继续运算,直到所有运算都完成才返回最终结果。这便是在本题所遇到的情况。

 首先我们需要知道的是,在“z += x++||y++||++z;”这条语句没有彻底执行结束之前,x++、y++、z++这三条语句的结果,只有z发生了变化,即自加1了,请注意,这里我们并没有真正运行完这条语句,这是我们分析的,因为题目所要求的是整条语句完全运行结束后x、y、z的值。如果这三条语句全部执行了,那么当这一整个大的语句执行后,x、y、z的值是一定发生了变化的,但是如果没有,那么我们就要看具体执行哪些语句。 现在我们继续来看“z += x++||y++||++z;”这条语句,先看等号右边,有两个逻辑或运算符“||”,就要先从左边第一个“||”表达式开始看,(x++)在这里x的值并没有发生改变,所以x依然是5,即为真1,此时第一个逻辑或表达式的值就出来了,即为真1,y++并没有执行,所以y的值并没有改变,还是7;

 最后就是判断z的值发生了哪些变化了,我们可以看到z在这条语句中发生了两次改变,第一次是等号右边的z++,第二次是等号左边的自加一个数,加的这个数是看我们右边表达式的结果的,所以我们继续分析右边的运算,既然我们上一步已经得到了第一个逻辑或的运算结果为真1了,并且在右边第二个也是逻辑或的情况下,我们就没必要再分析一遍了,直接同理就可以得出等号右侧整个表达式的结果为真,即1,然后就变成了z += 1;执行后z = 9;

 当整个过程分析过后,我们知道了在x++、y++、z++这三条语句中,只有x++执行了,执行前x = 5,整个“z += x++||y++||++z;”语句彻底执行后,x = 6,y = 7 ,z = 9 。

总结

经验分享 程序员 微信小程序 职场和发展