Ankündigung

Einklappen
Keine Ankündigung bisher.

Warum ergibt folgendes Skript true?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Warum ergibt folgendes Skript true?

    Guten Tag, ich lerne gerade PHP und habe eine Frage zu (Vergleichs- und logischen) Operatoren und deren Rangfolge.

    Ich wäre mega Dankbar wenn mir jemand erklärt warum folgendes true ergibt:
    PHP-Code:
    $var1 10;
    $var2 10;
    $string1 "10";

    $result $var1 $var2 || $string1 20;

    var_dump($result
    Ich denke schon seit einigen Stunden darüber nach und komm einfach nicht drauf

  • #2
    $string1 = 20 ist eine Zuweisung.
    Verwende: $string1 == 20

    Kommentar


    • #3
      Dies ist eine Aufgabenstellung, ich muss hier erklären warum $result true ergibt
      Liegt es vielleicht daran, dass $string1 durch die Zuweisung, automatisch den Wert true erhält? Ich glaube es liegt eher an der Rangfolge/Priortät der Operatoren.

      Kommentar


      • #4
        Eigentlich macht es doch keinen Sinn einen logischen Operator mit einem Integer zu verwenden

        Kommentar


        • #5
          Zitat aus dem Mannual (https://www.php.net/manual/de/langua...assignment.php)
          Der Wert eines Zuweisungs-Ausdruckes ist der zugewiesene Wert. D.h. der Wert des Ausdruckes "$a = 3" ist 3.

          Deshalb kann man z.B. auch sowas machen:
          PHP-Code:
          $a $b $c 20
          20 wird zu true, wenn es in einen boolean umgewandelt wird. Siehe https://www.php.net/manual/de/langua...es.boolean.php

          Grüße.

          Kommentar


          • #6
            Zitat von Brathur Beitrag anzeigen
            Ich glaube es liegt eher an der Rangfolge/Priortät der Operatoren.
            Natürlich ist diese wichtig.
            Siehe https://www.php.net/manual/en/langua...precedence.php

            Danach sieht das so aus:

            Wir machen uns da Klammern drum um die Schritte besser zu verstehen
            PHP-Code:
            $result = ( $var1 $var2 || $string1 20 );
            $result = ( ($var1 $var2) || ($string1 20) ); 
            zuerst werden die inneren Ausdrücke des OR ausgewertet und zu einem Wahrheitswert ausgewertet. Das Ergebnis aus dem OR wird dann der Variablen result zugewiesen.
            PHP-Code:
            var_dump( ($var1 $var2), ($string1 20)  );
            var_dump( ($var1 $var2), (bool)($string1 20)  );
            var_dump($result

            Kommentar


            • #7
              Das Entscheidende steht in #2. Ich glaube nicht, daß jemand auf die Idee käme, "$var2 or $string1" zuerst auszuwerten. Im Folgenden die ausführliche Auswertung:
              PHP-Code:
                $var1 10;
                
              $var2 10;
                
              $string1 "10";

                
              $result $var1 $var2 || $string1 20;
                
              var_dump($result);                // Ergebn.: true
                
              echo '<br>&nbsp;<br>';
                
              $string1 "10";                  // erneut zuweisen, da oben "irrtümlich" Zuweisg. erfolgte

                
              $result = ($var1 $var2) || ($string1 20);
                
              var_dump($result);                // Ergebn.: true
                
              echo '<br>&nbsp;<br>';
                
              $string1 "10";                  // erneut zuweisen, da oben "irrtümlich" Zuweisg. erfolgte

                
              $result $var1 $var2 || $string1 == 20;
                
              var_dump($result);                // Ergebn.: false, da beide Vergleiche false
                
              echo '<br>&nbsp;<br>';

                
              $result = ($var1 $var2) || ($string1 == 20);
                
              var_dump($result);                // Ergebn.: false, da beide Vergleiche false
                
              echo '<br>&nbsp;<br>';

                
              $result $var1 == $var2 || $string1 == 20;
                
              var_dump($result);                // Ergebn.: true, da linker Vergleich = true
                
              echo '<br>&nbsp;<br>';

                
              $result = ($var1 == $var2) || ($string1 == 20);
                
              var_dump($result);                // Ergebn.: true, da linker Vergleich = true
                
              echo '<br>&nbsp;<br>'
              Wie man sieht, haben die Klammern keine Auswirkung.

              Kommentar


              • #8
                Ja hier nicht da die Klammern so gesetzt wurden wie es PHP auch ohne Klammern interpretiert hätte. Wenn jedoch die Rangfolge von Operatoren mit ins Spiel kommt bestimmen die Klammern die Reihenfolge der Abarbeitung.
                Typisches Beispiel:

                PHP-Code:
                $bool true AND false;  
                var_dump($bool);  //bool(true)

                $bool = (true AND false);
                var_dump($bool);  //bool(false) 
                Es heißt also Aufpassen beim Setzen von Klammern.

                Kommentar


                • #9
                  Wenn jedoch die Rangfolge von Operatoren mit ins Spiel kommt
                  ... kann es schon auch gemein werden. Eines meiner Lieblingsbeispiele dazu (AND vs. &&):

                  PHP-Code:
                  $var true && false;
                  var_dump($var);  // bool(false)

                  $var true and false;
                  var_dump($var);  // bool(true) 
                  The string "()()" is not palindrom but the String "())(" is.

                  Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                  PHP.de Wissenssammlung | Kein Support per PN

                  Kommentar


                  • #10
                    Zitat von Alf2016 Beitrag anzeigen
                    Das Entscheidende steht in #2.
                    Nö, das ist falsch.
                    Die Aufgabe steht so fest, lese er Beitrag #3.

                    Zitat von Alf2016 Beitrag anzeigen
                    Ich glaube nicht, daß jemand auf die Idee käme,
                    Glaube ist an dieser Stelle.nicht relevant und diese Konstellation wie in der Aufgabe genannt, kommt gar nicht so selten vor.

                    Kommentar


                    • #11
                      Zitat von Brathur Beitrag anzeigen
                      ... wenn mir jemand erklärt warum folgendes true ergibt:
                      Zitat von Doku
                      $a || $b .. TRUE wenn $a oder $b TRUE ist.
                      PHP-Code:
                      $var1 10;
                      $var2 10;
                      $string1 "10";

                      // $var1 > $var2 || $string1 = 20;

                      // aufgeteilt also:

                      var_dump($var1 $var2);  // false

                      var_dump($string1 20);  // 20

                      var_dump(false || 20);   // true

                      // das 20 wird im || Vergleich zu true gecastet - siehe Doku Auszug oben
                      // entspricht also:
                      var_dump(false || true);   // true 

                      Und false || true ist nunmal true. Hat somit also eigentlich nichts mit Rangfolge oder Klammern oder so zu tun.

                      LG
                      The string "()()" is not palindrom but the String "())(" is.

                      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                      PHP.de Wissenssammlung | Kein Support per PN

                      Kommentar


                      • #12

                        hausl du hast recht, aber bezogen auf die Fragestellung bleibt offen warum $result = $var1 > $var2 nicht zugewiesen wird, also warum FALSE nicht im result steht und das liegt an der Reihenfolge --> https://www.php.net/manual/en/langua...precedence.php

                        Ersetze || durch OR und du erhältst obwohl die Logik gleich bleibt, ein anderes Ergebnis.
                        PHP-Code:
                        $result $var1 $var2 OR $string1 20;
                        var_dump($result);  // boolean false 
                        Daher auch mein Beitrag #6 sich da Klammern darum zu denken um es aufzulösen.

                        Kommentar


                        • #13
                          Beschreibung der Operator Rangfolge:

                          Code:
                          $boolean = FALSE || TRUE;
                          wird wie folgt interpretiert:
                          Code:
                          ($boolean = (FALSE || TRUE));
                          Ergebnis: TRUE

                          Code:
                          $boolean = FALSE OR TRUE;
                          wird wie folgt interpretiert:
                          Code:
                          (($boolean = FALSE ) OR TRUE);
                          Ergebnis: FALSE

                          Kommentar


                          • #14
                            Kurz und schmerzlos.

                            Kommentar


                            • #15
                              Zitat von protestix Beitrag anzeigen
                              hausl du hast recht, aber bezogen auf die Fragestellung bleibt offen warum $result = $var1 > $var2 nicht zugewiesen wird, also warum FALSE nicht im result steht und das liegt an der Reihenfolge --> https://www.php.net/manual/en/langua...precedence.php
                              Weil das nur ein Teil des Ausdruckes ist.. Aber ja stimmt schon auch.

                              Zitat von protestix Beitrag anzeigen
                              Kurz und schmerzlos.
                              jep
                              The string "()()" is not palindrom but the String "())(" is.

                              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                              PHP.de Wissenssammlung | Kein Support per PN

                              Kommentar

                              Lädt...
                              X