Wo ist das 'or' von z.B. 'or die("Fehler")' dokumentiert?



  • Hallo,

    wie der Titel schon sagt konnte ich leider keine Dokumentation zum or statement finden. Ich hätte es bei den Kontrollstrukturen vermutet, aber ich konnte da nichts finden.

    sollte ein
    $a = bordie("fehler");nichtidentischmitb or die("fehler"); nicht identisch mit a = b;if(b; if(a)
    die("fehler");
    bzw
    if($a = $b)
    die("fehler");
    sein?

    bei die() ist es das auch, aber ein return bringt mir nen syntax fehler "unexpedted return"
    Kann mir das jemand erklären? vielen dank



  • or ist das gleiche wie || (mit anderer Priorität glaub ich). Mittels Kurzschlussevaluation wird der rechte Operant nur ausgeführt wenn der Linke falsch ist.



  • OK, alles klar. Dann ist das also einfach der ganz normale logische Operator.
    Mir war nicht klar, dass man diese auch außerhalb von Kontrollstrukturen oder Zuweisungen benutzen kann.
    Muss ich morgen gleich mal ausprobieren ob C das auch so erlaubt.

    Und return kann ich nicht verwenden, weil es ein sprachkonstrukt ist und keine normale funktion?
    oder gibt es eine andere erklärung?



  • CGI-BIN schrieb:

    Und return kann ich nicht verwenden, weil es ein sprachkonstrukt ist und keine normale funktion?
    oder gibt es eine andere erklärung?

    Ja: "return x" ist kein Ausdruck mit einem bestimmten Typ, sondern eine Anweisung. Die Grammatik der Programmiersprache verbietet das Verbinden von Anweisungen mit logischen Operatoren. Du kannst auch nicht schreiben: if(return x) { ... } oder if(if(x) y else z) { ... }. In aelteren Sprachen wie Pascal kann eine Zuweisung (a = b) zum Beispiel auch nicht anstelle eines Ausdrucks verwendet werden: if a := b ist in Pascal unzulaessig, weil a := b keinen Wert darstellt bzw. zurueckgibt, sondern eine Anweisung ist.

    Short-circuit evaluation gibt es in C uebrigens auch. Daher wird das folgende wie gewuenscht funktionieren, ist aber sehr unueblicher Stil:

    (a = b) || die();
    

    Allerdings muss sich der Rueckgabewert von die() in einen bool konvertieren lassen. Die Funktion die() darf also insbesondere nicht void als Rueckgabetyp haben.



  • Danke für die Erklärung, wieder was gelernt 😉

    Ich wusste zwar, dass bei logischen Verknüpfungen innerhalb einer Bedingung nur so viele Ausdrücke ausgewertet werden bis das Ergebnis feststeht, aber nicht dass ich das auch als normalen Ausdruck verwenden kann.



  • Christoph schrieb:

    In aelteren Sprachen wie Pascal kann eine Zuweisung (a = b) zum Beispiel auch nicht anstelle eines Ausdrucks verwendet werden: if a := b ist in Pascal unzulaessig, weil a := b keinen Wert darstellt bzw. zurueckgibt, sondern eine Anweisung ist.

    Das hat mit älter nichts zu tun. In Lisp ist die Zuweisung schon ein Ausdruck. Wenn sowas heute häufiger vorkommt, liegt das wahrscheinlich daran, dass die meisten Mainstream-Sprachen heute entweder von C abstammen oder stark von C beeinflusst sind.



  • In PHP funktioniert das und ist eine häufige Fehlerquelle.

    <?php
    $b = 3;
    if($a = $b)
      echo 'Der Variablen $a wurde erfolgreich der Wert von $b zugewiesen';
    ?>
    


  • Deine Interpretation, dass die Zuweisung fehlgeschlagen ist, ist falsch.
    Tatsächlich wertet die if anweisung den wert von a bzw b aus, der ja nach der zuweisung gleich ist.

    führ mal das aus:

    $a = 100;
    if($a = 0)
      echo 'IF: a='.$a;
    else
      echo 'ELSE: a='.$a;
    

    obwohl der else fall eintritt war die zuweisung der null sehr wohl erfolgreich!
    übrigens geht ja auch $a = $b = $c aus dem selben grund, dass die zuweisung selbst wieder ein wert ist.
    Ob ichs so formal richtig formuliert habe weiß ich nicht 😉
    Aber ich denke das stimmt schon so


Anmelden zum Antworten