【问题标题】:Programmimg Logic编程逻辑
【发布时间】:2011-04-07 23:31:26
【问题描述】:

我是编码世界的新手,很难理解下面的逻辑。如果有人可以向我解释,将不胜感激。让我从 If 语句开始。

/* 示例代码 */

if($username == "123") {
//some code here;
}

if ($username == "abc") {
//some code here;
}

我的理解是,如果第一条语句失败,则进入第二条语句,即如果 $username 不等于 123,则测试它是否为 abc。对吗?

现在,让我用 else 语句扩展相同的代码

/* 示例代码 */

if($username == "123") {
//some code here;
}

if ($username == "abc") {
//some code here;
}

else {
//some code here;
}

我的理解是,如果第一个语句失败,即 $username 不等于 123,则测试第二个语句。如果第二条语句失败,即 $username 不等于 abc,则继续执行 ELSE,如果所有前面的 IF 语句都失败,则它是一个包罗万象的方法。对吗?

让我使用 ELSE IF 语句再次对此进行扩展

/* 示例代码 */

if($username == "123") {
//some code here;
}

else if ($username == "abc") {
//some code here;
}

else {
//some code here;
}

这段代码与 2 个单独的 if 语句有何不同? ELSE在整个代码块中做了什么?

【问题讨论】:

    标签: php logic


    【解决方案1】:

    两者的区别:

    if() {
    
    }
    else if() {
    
    }
    

    if() {
    
    }
    if() {
    
    }
    

    是始终测试第二个示例中的第二个条件,而不管第一个 if 条件。在第一个示例中,第二个子句仅在第一个子句为 false 时执行。

    【讨论】:

    • 太棒了。这样就清楚多了。在这两个例子中,ELSE 如何适合方程?
    • 如果你在第一个例子中添加了一个 else ,如果 if 和 else if 都失败了,它将执行。如果你在第二个例子中添加一个 else,如果你放在它后面的 if 子句失败,它将执行
    • 所以澄清一下。如果我在第二个示例中放置一个 ELSE,即 if(){ } if() { } else{ } 如果满足条件,则第一个 IF 语句将执行,ELSE 也可能如果第二个条件失败则执行。对吗?
    • 是的。在这种情况下,第一个 IF 的结果不会影响 else 子句。如果第二个 if 计算结果为 false,则将执行 else 子句。确切地 ! :D
    • 好的,所以我可以为每个 IF 语句设置多个 ELSE 语句,例如if() { } else { } if() { } else { } 我想在这样的例子中最好有 ELSE IF 语句
    【解决方案2】:

    在您的示例中,由于“123”从不等于“abc”,因此它们是等价的。在现实生活中,ifs 不需要关联:

    if (a) {
      // Do something
    } else if (b) {
      // Do something else
    } else {
      // Do something else
    }
    

    不同于

    if (a) {
      // Do something
    }
    if (b) {
      // Do something else
    } else {
      // Do something else
    }
    

    在第二种情况下,ab 可能都为真,在这种情况下,两条线都会触发。在第一种情况下,只会触发第一行,因为 else 甚至永远不会被读取。

    【讨论】:

    • 谢谢。那么 ELSE 语句在这两个示例中是如何工作的呢?关于 IF 和 ELSE IF 的部分更加清晰,但是我仍然对 ELSE 感到困惑
    • ELSE 仅在其相关 IF 为 false 时执行。在第一个示例中,最后一个 ELSE 在技术上仅与第二个 IF 相关,如果第一个 IF 为真,则 ELSE IF 不会触发,因此 ELSE 不会触发。在第二个示例中,最后一个 ELSE 与第二个 IF 相关,但与第一个 IF 无关。因此,无论第一个 IF 发生什么,如果第二个 IF 不为真,ELSE 都会触发。
    • 因此在第二个示例中,假设第二个 IF 不正确,第一个 IF 可能与 ELSE 一起触发。
    • 是的,第一个 IF 和下一个 IF 完全不相关。
    【解决方案3】:

    在这种情况下它们是相同的:

    if($username == "123") {
    //some code here;
    }
    
    if ($username == "abc") {
    //some code here;
    }
    

    反对

    if($username == "123") {
    //some code here;
    }
    
    else if ($username == "abc") {
    //some code here;
    }
    

    不同之处在于else if 如果第一种情况为真,则第二种情况永远不会触发。

    例如

    if($username == "123") {
    //some code here;
        $username = "abc"
    }
    
    if ($username == "abc") {
    //some code here;
    }
    

    两个代码 if 语句代码块都将被执行,如下所示:

    if($username == "123") {
    //some code here;
        $username = "abc"
    }
    
    else if ($username == "abc") {
    //some code here;
    }
    

    只会执行第一个 if 语句代码块。

    【讨论】:

      【解决方案4】:

      你错了,它是这样工作的:

      if($something == "something")
      {
      //code
      }
      if($something == "somethingelse")
      {
      //code
      }
      

      无论$something 等于什么,都将测试上述两者,因为它们是两个独立的 if 语句。所以如果你这样做:

      $something = "something";
      if($something == "something")
      {
           echo $something;
      }
      $something = "somethingelse";
      if($something == "somethingelse")
      {
          echo $something;
      }
      

      那么输出将是“somethingsomethingelse”,因为两者都经过测试。请注意,在 if/elseif/else 结构中,将一行代码放在一个块的结尾和另一个块的开头之间会出现语法错误。

      if($something == "something")
      {
      //code
      }
      else
      {
      //code
      }
      

      在此,将测试第一条语句,如果为真,则将运行该代码。如果为 false,则将出现 else 块中的代码。

      if($something == "something")
      {
      //code
      }
      elseif($something == "somethingelse")
      {
      //code
      }
      else
      {
      //code
      }
      

      在此它将检查第一个 if 语句,如果为真,则该代码运行。如果为假,则检查 elseif 语句,如果为真,则运行该语句。如果为 false,它将运行 else 块。 else 块是一个包罗万象的。

      所以在这样的情况下:

      if(false)
      {
      //code
      }
      elseif(false)
      {
      //code
      }
      else
      {
      //code
      }
      

      else 块将始终运行。

      类似的事情也发生在多条件语句中,例如:

      if(is_string($something) && $something == "something")
      

      如果is_string($something)为假,则不会检查第二个条件,因为在使用AND时它们都必须为真,如果is_string($something)为真而$something == "something"为假,则整个if条件为假, 再次因为它们都必须是真的。

      if($something == "something" || $something == "somethingelse")
      

      在这个 OR 语句中,它将检查第一个是否为假,因为一个或另一个必须为真才能使 if 语句为真。因此,如果$something 确实等于"somethingelse",那么 if 语句将被认为是真的。但是,如果$something 确实等于"something",则不会检查第二个条件,因为它已经获得了使语句为真所需的真条件。

      所以 if 条件中的 && 条件就像是在做:

      if(is_string($something))
      {
           if($something == "something")
           {
           //code
           }
      }
      

      and and || 语句就像在做:

      if($something == "something")
      {
          //code
      }
      elseif($something == "somethingelse")
      {
         //same code as previous if statement
      }
      

      这是一个例子:

      //this would be pulled from a page called like:
      //http://www.domain.com/page.php?num=5&num2=10
      $num = $_GET['num'];  //5
      $num2 = $_GET['num2'];  //10
      
      if(!is_numeric($num))
      {
          echo 'Number 1 is not a number, cannot continue <br />';
      }
      elseif(!is_numeric($num2))
      {
          echo 'Number 2 is not a number, cannot continue <br />';
      }
      else
      {
           if($num > $num2)
           {
               echo 'Number 1 is bigger than Number 2 <br />';
           }
           elseif($num2 > $num)
           {
               echo 'Number 2 is bigger than Number 1 <br />';
           }
           else
           {
               echo 'Numbers are equal <br />';  
               //Since if the numbers are neither greater than or less than each other, they must be equal to one another
           }//end if
      
           //% is the modulo operator, basically returns the remainder of division
           //so !($num % $num2) is if the remainder of $num / $num2 == 0, I.E. NOT(!) $num % $num2
           //! basically makes it take the opposite of the result, so !(0) is true, and 0 is false
           //in the same way !(true) is literally NOT true (in other words false) 
           //and !(false) is literally NOT false (true) 
           if(!($num % $num2))  
           {
               echo 'Number 1 is a multiple of Number 2 <br />';
           }
           else
           {
               echo 'Number 1 is not a multiple of Number 2 <br />';
           }//end if
      
           if(!($num2 % $num))
           {
               echo 'Number 2 is a multiple of Number 1 <br />';
           }
           else
           {
               echo 'Number 2 is not a multiple of Number 1 <br />';
           }//end if
      
           echo 'The sum of the numbers is ' . $num + $num2;
      
      }//end if
      

      因此,有了这个,并且输入 num=5&num2=10,输出将是

      Number 2 is bigger than Number 1
      Number 1 is not a multiple of Number 2
      Number 2 is a multiple of Number 1  //Note that both of the multiple conditions were tested, because they are separate
      The sum of the numbers is 15
      

      如果输入为 num=16&num2=3,则输出为:

      Number 1 is bigger than Number 2
      Number 1 is not a multiple of Number 2
      Number 2 is not a multiple of Number 1
      The sum of the numbers is 19
      

      输入 num=16&num2=word,唯一的输出是

      Number 2 is not a number, cannot continue
      

      输入为 num=4&num2=4,输出为

      Numbers are equal
      Number 1 is a multiple of Number 2
      Number 2 is a multiple of Number 1
      The sum of the numbers is 8
      

      【讨论】:

      • 哇,那是相当多的阅读,但我想我明白了。因此,在使用 ELSE 语句的情况下,它总是包罗万象。可以这样假设吗?
      • 是的,它总是包罗万象。如果 if/elseif 结构中没有其他内容为真,则执行此操作。你来到一个四路交叉口,如果你要去杂货店然后左转,否则如果你要剪头发然后右转,否则(否则)继续直行。另外,请记住,在 if/elseif/else 结构的顶部只能有一个 if,并且在其末尾也只能有一个 else,但您可以根据需要有多个 elseif。现在,您可以嵌套 if/elseif/else,将 if 放入另一个 if,就像上面的 &amp;&amp; 示例一样。
      • 谢谢菲尼克斯。 Joe Enos 提到 ELSE 语句与前面的 IF 有关系,因此在下面的示例中,如果满足第一个条件但第二个条件失败。 ELSE 语句仍然可以为真,例如if(true){ } if(false){ } else{ //true } 希望我没有把自己弄糊涂。
      • 是的。有点。在您的示例中,第一个 if 语句与第二个 if/else 语句无关,它们是完全独立的,因此为什么如果第一个为真而第二个为假,第二个语句中的 else 将运行,因为第一个语句具有完全没有关系。这是一个完全独立且自包含的逻辑过程,可以拥有自己的 elseif 和 else。无论何时使用if(something),它都是一个全新的逻辑块,可以通过 elseifs 和 else 进行扩展。当然,它们可以包含在其他逻辑块中。
      • 例如if(true){ if(false){}else{//this runs}//end nested if }//end original if。如果我在您给出的示例中使用这样的符号可能会更容易理解:if(true){}//end first ifif(false){}else{//true} //end second if} 关闭块,如果它后面没有 elseif 或 else,那么就是这样ifelseifelse 是唯一扩展 if 语句以检查更多潜在条件的事物(或在 else 的情况下捕获所有情况),另一个 if 开启了一个全新的事物。
      【解决方案5】:

      我的理解是 IF 第一 语句失败,进展到 第二个语句,即 if $username 不等于 123 然后测试 不管是abc。对吗?

      这是不正确的。两个表达式都将被评估;但是,最多其中一个可以是真的。您的第三个示例的行为方式与您在上面描述的方式相同。

      在您的第二个示例中,如果 $username == "123",则与第一个 if 语句关联的块将执行;但是,与第二个 if 语句关联的“else”块也将执行。

      【讨论】:

        【解决方案6】:

        在第一个示例中,两个“if”语句都被执行。如果两者都为真,那么两者都会发生。

        在您的情况下,两者都不正确,但这不是不使用“else”的理由。如果没有别的[没有双关语],“else”将为未来的程序员提供语义提示,您只期望两个子句中的一个为真。

        你陈述的唯一方式:

        如果第一条语句失败,则继续执行第二条语句

        如果第二个语句确实在第一个语句的“else”子句中,则为 true。

        【讨论】:

          【解决方案7】:

          仅在最后一个 sn-p 中,代码的行为与您描述的一样。当您有一个if 后跟第二个if 时,both 测试都会执行。代码流中没有共生关系。

          【讨论】:

            【解决方案8】:
            if(X1){
                A;
            }elseif(X2){
                B;
            }elseif(X3){
                C;
            }else{
                D;
            }
            

            这意味着:如果 X1 计算为真,则执行 A。如果不是,则查看 X2 是否计算为真。如果是,则 B. 如果不是,请查看 X3 的计算结果是否为真。如果是 C. 如果不是那么就做 D.

            if(X1){
                A;
            }
            
            
            if(X2){
                B;
            }
            

            这意味着:如果 X1 计算结果为真,则执行 A. 第一个 if 结束。然后另一个 if 出现:如果 X2 计算结果为 true,则执行 B。这两个 if 语句与我的第一个示例不同。

            php 中的替代 if 语法使其更清晰:

            我的第一个替代语法示例:

            if(X1):
                A;
            elseif(X2):
                B;
            elseif(X3):
                C;
            else:
                D;
            endif;
            

            我的第二个例子:

            if(X1):
                A;
            endif;
            
            
            if(X2):
                B;
            endif;
            

            在这里你清楚地看到这两个 if 语句是相互分离的。

            【讨论】:

            • 也尽量不要将else与结束}分开
            • 感谢 lTroubs。不太符合您所说的“也尽量不要将 else 与结束 } 分开”
            • if(X){dosomething;}else{dosomethingelse;} 例如,我将}else{ 始终放在一行中。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多