说说第14题。
首先运算符 &&
是逻辑与,表示左右两边的两个操作数都为真(不为0)则运算结果为真,运算顺序或者检查顺序是从左向右的,而一旦有一个不为真那么后面的条件就不检查了。
运算符
||
是逻辑或,表示左右两边的两个操作数都为假(为0)则运行结果为假,同样的,运算顺序或检查顺序是从左向右的,而一旦有一个为真的话,那么后面的条件也不必检查了。
(1)第一次的printf。分析「++x && ++y || ++z;」这句语句,++x 是对x先自加1,再使用x的值,那么原来x的值是-1,自加1之后就变成了0,那么 ++x && ++y 这部分就相当于是 0 && ++y , 0 是 假 , 那么 && 右边的表达式就不再检查了,也就是 ++y 没有执行。那么整个「++x && ++y」的值就是0了,这样,这个表达式就进化成了「0 || ++z」,后面的 ++z 需要检查,于是z的值也变成了 0 。 所以 第一次的printf输出的结果是「x = 0 y = -1 z = 0」。
(2)第二次的printf。跟上面的道理一样,从左向后看, ++x之后x的值是0,0 || ++y 则 ++y 需要检查,于是 y 的值也编成 0 , 而 0 && ++z 则 ++z 不必执行, 所有最终 x 为0 , y 为0 , z 仍为 -1。
(3)第三次的printf。++x 之后 x 的值为0, 则 0 && ++y 右边的 ++y 不必检查, y 保持 -1 , 整个表达式进化为 0 && ++z , 同样的, ++z 也不必检查, z 保持 原来的值 -1 , 所以输出 「x = 0 y = -1 z = -1 」