前言导入
相信你在c语言中一定遇到过像下面一样复杂的表达式判断。
他的结果中为什么会输出Hello!? 为什么b,c的值没有改变?相信你读完这篇文章便可以直到原因。
优先级
相信大家在学习c语言中一定见到过下面这张图。
这是一张比较完整的操作符,从上到下优先级依次递减。运算符的优先级决定了它们在表达式中的计算顺序。优先级高的运算符会先于优先级低的运算符进行计算。这是百度上的解释,容易让我们理解成优先级高就先运算。 如果照这样理解的话,a++ || b-- && c++中后缀++ --的优先级远高于 || && 因该先运算得到结果 2 || 0 && 2,然后 &&优先级高,2 || 0结果为真,输出hello 2 0 2.但结果并非如此,是vs编译错了么? 下面是devc++上的运行结果。
答案与vs上的一模一样,显然此时不可能是编译器出错了,只可能是我们理解错了,或者说百度的解释太迷惑人了。我认为优先级应该再加几个字,结合优先级,便于我们理解。
a++ || b-- && c++ 可以写为 a++ || (b-- && c++),其中可以给后置++ --在加上(),这里就不写了,不便于观察主体结构。原来复杂的表达式,我们可以用()划分结构,便于我们理解。
此时 【a++ || (b-- && c++)】主操作符是||,而&&是||操作符下的一个分支中的操作符,然后我们根据主操作符的运算顺序开始计算。从上表可知 ||是从左到右计算,依次是【2 || (b-- && c++)】-》
【2 || (0 && c++)】-》【2 || (0 && 2)】-》为真,理解到这里你已经打败大部分人了,但结构2 1 1与这不同,这是为什么呢?这就涉及到了我们接下来要讲的短路了!
短路
你没有听错,这个c语言的专业术语就叫短路,但当然与物理电学中的短路不一样了。短路的设计是为了减小运算,提高速度用的。下面让我们回顾下 &&与||
&& 当&&两边都为真时,逻辑判断结果才为真。
|| 当||两边有一个为真时,逻辑判断结果才为真。
(多说一句,在c语言中,只有数字0为假,其他非0数字为真,包括-1,-2,1等数字)
根据我们上述的优先级,我们可以知道&&与||都是从左往右运算的,那么我们试着推演一下。
&&
a && b,当a为1时,我们不知道整个&&逻辑结果,只有继续判断b才可以得到答案。b为0,整个逻辑结果为假,b为1,逻辑结果为真。
但当a=0时,&&的逻辑结果有可能为真么???结果显然不可能。那么换句话说,我们此时还需要判断b么?显然不需要,我们已经可以根据a判断整个逻辑结果为假,没必要在消耗算力在判断b上面了,早期的计算机的算力不像我们如今的电脑,那是都是扣紧裤腰带过日子,能省则省。
||
与上面相同,判断 a|| b时,如果我们知道 a==1即为真,那么我们便不需要在判断b了,||逻辑判断结果就为真。
这就是&&与||的短路!
回顾
此时在让我们看开头的题目,先根据优先级可以划分为【a++ || (b-- && c++)】,然后从左计算,a++先用在加 ,【1 || (b-- && c++)】,此时||左边为真发生短路,后面的代码就不运行了,所以b=1,c=1没改变。输出为
下面我们在做一题检测下吧,先想好你的答案在翻哦
显然此时可划分为 【(a++ && b++) || c++ 】,然后从左往右计算,(2&&2)为真,下一步( 1 ||c++ ),发生短路,所以输出 2 2 1
(在c语言中逻辑判断结果为真用1表示,为假用0表示)。
感谢大家的观看,喜欢的点点赞,收藏。