zoukankan      html  css  js  c++  java
  • 拾零之 :if 判断顺序的问题

    问题:if ( conditionA && conditionB ) 和 if ( conditionA || conditionB ),是先判断conditionA还是conditionB ?跟编译器有没有关系?

    答:是先判断条件A,再判断条件B。C语言是短路求值的,都是先判断第一个表达式,如果能预先求出表达式结果,后面的判断就不会执行了。

    //
    //如此说来   (exp1   ¦ ¦   exp2   &&   exp3)和(exp2   &&   exp3   ¦ ¦exp1)会有不同的结果,这也不符合生活习惯呀。这难道是“++副作用” 
    //===================================
    //你举的两个运算的含义分别如下:
    //1)
    //(exp1   ¦¦   exp2   &&   exp3) 
    //==> 
    //(exp1   ¦¦   (exp2   &&   exp3))
    //==>
    //exp1 ? 1 :  (exp2   &&   exp3)
    //
    //2)
    //(exp2   &&   exp3   ¦ ¦exp1)
    //==>
    //((exp2   &&   exp3)   ¦ ¦exp1)
    //==>
    //(exp2   &&   exp3) ? 1 : exp1
    //
    //由此可以看出,这是不同的运算过程,当然很有可能产生不同结果
    //
    //至于你说到的矛盾,并不存在,原因如下:
    //&& 的优先权高于 || ,指的是数学中的结合律
    //比如: 2 * 3 + 4 * 5 = (2 * 3) + (4 * 5) = 6 + 20 = 26
    //但是因为计算机中的计算是一步步来的,所以计算过程可能是
    //2 * 3 + 4 * 5 = (2 * 3) + (4 * 5) = 6 + (4 * 5) = 6 + 20 = 26 
    //(方式1: 先计算运算符左边的表达式,这个比较符合我们的习惯)
    //但也有可能是
    //2 * 3 + 4 * 5 = (2 * 3) + (4 * 5) = (2 * 3) + 20 = 6 + 20 = 26 
    //(方式2: 先计算运算符右边的表达式)
    //
    //但是我们的C语言中,具体采取的是哪种方式呢?
    //如果我没记错的话,很多运算的计算次序都没有规定死,是由编译器(比如VC++, tc是不同的编译器)的实现者自己选择的
    //即先算左边,还是先算右边,并不确定
    //
    //然后让我们回到 _逻辑短路原则_ 这个话题
    //_逻辑短路原则_ 恰恰就是对 逻辑运算过程 计算次序的一个规定,规定:先计算运算符左边的表达式
    //那么,假设有一个运算
    //T && T || F && T
    //由运算优先级!,有
    //(T && T) || (F && T)
    //这时面临一个选择,先计算 || 左边还是右边?
    //参考 _逻辑短路原则_,先计算左边 (T && T) => T
    //从而有
    //T || (F && T)
    //再次参考 _逻辑短路原则_ 
    //因为运算符是 || ,"或"运算,此时由左边的 T 即可确定整个运算式的值,
    //那么编译器判断计算可以结束,右边的(F && T)从而被掠过
  • 相关阅读:
    uniq 只能相邻行去重
    uniq 只能相邻行去重
    uniq 只能相邻行去重
    KVO(1)
    KVO(1)
    KVO(1)
    KVO(1)
    解决 Retrofit 多 BaseUrl 及运行时动态改变 BaseUrl ?
    jquery 请求成功后
    事故现场:MySQL 中一个双引号的错位引发的血案
  • 原文地址:https://www.cnblogs.com/benevo/p/2975587.html
Copyright © 2011-2022 走看看