欢迎关注微信公众号:计算机二级C语言 ,获取更多信息。
在昨天的文章中,我们已经提到了优先级与求值顺序无关(C语言运算符优先级),涉及到的还有短路求值(short-circuit evaluation)问题,接下来具体讲一下。
在逻辑表达式的求值过程中,按其操作数从左至右的计算顺序,当某个操作数的值可以确定整个逻辑表达式的值时,其余的操作数不再计算。
逻辑运算符“&&”和“||”都具有短路特性。
有同学会说,这也没啥影响啊,只是计算机处理的时候步骤优化变少了,我们按照优先级顺序计算也是一样的结果。
正常计算结果是没有影响的,但涉及到自增自减、赋值运算的时候,有没有被短路就有区别了。如下图,按照优先级顺序,自增自减运算优先级高,数值应该发生变化,但涉及到短路求值问题,被短路的部分并没有执行,数值也就没有变化。
在第一个式子中,计算顺序如下:
++x //先让x的值加1,再使用x
--y //先让y的值减1,再使用y
(++x)&&(--y) //即 2&&0,运算结果是0
(++x)&&(--y)&&++z
/* 对于第二个逻辑运算&&,
左边操作数已经是0了,
右边被短路,++z没有执行,
故z的值为1不变 */
其他的例子大家自行验证一下就好明白了。