C语言 &&与 || 混合复杂问题

 前言导入

         相信你在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表示)。

        感谢大家的观看,喜欢的点点赞,收藏。

  • 38
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值