Assoziativität beim Trinitätsoperator

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

  • Assoziativität beim Trinitätsoperator

    Ich verstehe folgendes Beispiel nicht, kann mir jemand Schritt für Schritt erklären, wie PHP da auswertet?
    Hängt wohl mit der Assoziativität zusammen, aber warum kommt da nicht "btrue" heraus sondern" "ctrue" (für "btrue" müsste ich Klammern setzen, das ist klar, aber warum)?

    PHP-Code:
    function func($i$b)
    {
        echo 
    $i '<br />';
        return 
    $b;
    }
    $value func('a'true)
                  ? 
    func('b'true
                    ? 
    "btrue" "bfalse"
                  
    func('c'true
                    ? 
    "ctrue" "cfalse";
    echo 
    $value
    Zuletzt geändert von einermeiner; 09.01.2012, 14:26.

  • #2
    Der Code ist unlesbar. Sowas wird in der Praxis niemals vorkommen (solange der Programmierer kein Idiot ist).

    Kommentar


    • #3
      Das ist wohl richtig, wüsste es aber trotzdem gerne, ich selbst benutze den Operator auch nur auf 1 Ebene, aber in Schulklausuren könnte so etwas praxisfernes bestimmt abgefragt werden.

      Kommentar


      • #4
        Example #3:

        - PHP: Comparison Operators - Manual

        PHP-Code:
        $value =
            (
                
        func('a'true)
                    ?
                        (
                            
        func('b'true)
                                ? 
        "btrue"
                                
        "bfalse"
                        
        )
                    : 
        func('c'true)
            )
            ? 
        "ctrue" "cfalse"

        Kommentar


        • #5
          Komisch gemacht von den PHP Leuten
          Wenn ich das richtig sehe, würde in diesem Beispiel immer "ctrue" ausgegeben, außer wenn bei der Klammer davor (boolean) false herauskommt.
          In bspw. Java lässt sich das mit dieser Klammerung anscheinend gar nicht umsetzen, weil dort explizit ein boolean gefordert wird.

          Ich hoffe, dass so etwas niemals abgefragt wird, in der Praxis werde ich auf jeden Fall keinen verschachtelten Ternäroperator einsetzen.

          Kommentar


          • #6
            Zitat von einermeiner Beitrag anzeigen
            ... Ich hoffe, dass so etwas niemals abgefragt wird, ...
            Wer fragt wo wen ab?

            Solche von üblichen Erwartungen abweichende Eigentümlichkeiten werden bei 08/15-Tests ganz sicher nicht abgefragt. Das könnte sonst bei den Prüflingen den naiven Glauben an ein in sich logisch aufgebautes Software-Produkt zerstören.

            ... in der Praxis werde ich auf jeden Fall keinen verschachtelten Ternäroperator einsetzen.
            Wieso nicht? Solange du mindestens den Zweig nach ':' klammerst, verhalten sich die Ausdrücke, wie sie sollen.

            Ich würde beide Zweige in Klammern setzen. Eine alte Regel für c-basierte Sprachen lautet: "Wenn du dir nicht sicher bist, welcher Operator Vorrang hat, setze Klammern." Nur, wer die Operator-Prioritäts-Tabellen im Schlaf kann, verzichtet darauf.
            Zuletzt geändert von fireweasel; 09.01.2012, 23:45. Grund: typos, wikipedia-link
            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

            Kommentar


            • #7
              …und bekommt dafür von der Restwelt zu Recht vorgeworfen, das KISS-Prinzip zu verletzen. – Don't be clever.

              (Ich empfinde so was wie das Beispiel in #1 jedenfalls als Boshaftigkeit.)

              Wobei da dann wohl jeder wieder individuell die Grenze zwischen „so was muss man wissen“ und „ich setze lieber Klammern, weil ich mir selbst nicht sicher bin“ zieht.

              Ich kann mir denken, dass Klausuren da eher einen auf „muss man wissen“ machen. – Danach aber bestimmt nie wieder.

              Gibt da auch in der OOP ein paar sehr eklige Sachen mit Sichtbarkeiten und Vererbung und so, die hoffentlich nie jemand so programmieren wird.

              Kommentar


              • #8
                Wer fragt wo wen ab?
                Ich meinte Schulaufgaben, wo sollte so etwas sinnloses sonst abgefragt werden

                Kommentar


                • #9
                  Sehr schön zusammengefasst werden die Unterschiede zwischen If-Else und Konditional-Operator hier:
                  (...)

                  if is a statement. (test ? a : b) is an expression. They're not the same thing.

                  Expressions exist to express values. Statements exist to perform actions. Expressions can appear inside statements, but not vice-versa. So you can use ternary expressions within other expressions, like for terms in a summation, or for arguments to a method, and so on. You don't have to, but you can if you want to. There's nothing wrong with that. Some people might say that's evil, but that's their opinion.

                  One value of a ternary expression is it makes you to handle both true and false cases. if statements don't.

                  If you're worried about readability, you can format them readably.

                  (...)
                  Quelle: conditions - Is the ternary operator evil? - Programmers - Stack Exchange


                  Zitat von einermeiner Beitrag anzeigen
                  Ich meinte Schulaufgaben, wo sollte so etwas sinnloses sonst abgefragt werden
                  Ich glaube nicht, dass man da verschachtelte Konditional-Operatoren abfragt. Schon das unverschachtelte Original wird im Allgemeinen nicht gerne gesehen. Ein Informatik-Lehrer(?) hat kaum die Muße, dann noch Eigenheiten, die nur in PHP auftreten und den anderen c-typischen Sprachen widersprechen, zu diskutieren.

                  Zitat von mermshaus Beitrag anzeigen
                  ...

                  Wobei da dann wohl jeder wieder individuell die Grenze zwischen „so was muss man wissen“ und „ich setze lieber Klammern, weil ich mir selbst nicht sicher bin“ zieht.
                  In dem Fall wäre es (für mich) die Wiederherstellung konsistenten Verhaltens über verschiedene Sprachen hinweg. Wenn fast überall "? ... ? ... : ... : ... ? ... : ..." gleich funktioniert, setzte ich eben in PHP die Klammern, damit es dort auch so funktioniert, wie anderswo ohne. Ein ekliger Workaround, aber das bin ich von PHP so gewöhnt. Da ein solcher (verschachtelter) Ausdruck selten vorkommen dürfte, ist das auch weniger ein Problem. Das Ganze in ein verschachteltes If-Else umzubauen, fände ich dagegen umständlich und der Lesbarkeit nicht zuträglich. Aber das sieht jeder ein bisschen anders. Für sowas gibt es halt dann Coding-Standards.

                  Gibt da auch in der OOP ein paar sehr eklige Sachen mit Sichtbarkeiten und Vererbung und so, die hoffentlich nie jemand so programmieren wird.
                  Vererbung (ist unnötig[0] und) wird überschätzt.
                  --
                  [0] Composition und Delegation (wenn richtig implementiert) sollten ausreichen.
                  Zuletzt geändert von fireweasel; 15.01.2012, 11:45. Grund: typos, stackechange-zitat ergänzt
                  Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                  Kommentar


                  • #10
                    Zitat von fireweasel Beitrag anzeigen
                    Das Ganze in ein verschachteltes If-Else umzubauen, fände ich dagegen umständlich und der Lesbarkeit nicht zuträglich.
                    Also ich finde
                    PHP-Code:
                    if (func('a'true)) {
                        
                    $value func('b'true) ? 'btrue' 'bfalse';
                    } else {
                        
                    $value func('c'true) ? 'ctrue' 'cfalse';

                    deutlich lesbarer als
                    PHP-Code:
                    $value =
                        (
                            
                    func('a'true)
                                ?
                                    (
                                        
                    func('b'true)
                                            ? 
                    "btrue"
                                            
                    "bfalse"
                                    
                    )
                                : 
                    func('c'true)
                        )
                        ? 
                    "ctrue" "cfalse"
                    Ich hab eben mehrere Minuten gebraucht um dieses Ungetüm zu verstehen und umzuschreiben. Wenn ich sowas in der Praxis sehen würde, würde ich den Programmierer fragen, was er für Drogen nimmt und ob er die nicht absetzen, oder mit dem Programmieren aufhören kann.
                    Zuletzt geändert von h3ll; 11.01.2012, 15:02.

                    Kommentar


                    • #11
                      Wobei du da die Variante produziert hast, die „erwartbar“ funktioniert, und nicht die aus der Aufgabenstellung.

                      Das Äquivalent zu deinem if-else-Konstrukt wäre:

                      PHP-Code:
                      <?php

                      function f($symbol$value)
                      {
                          echo 
                      $symbol '<br />';
                          return 
                      $value;
                      }
                          
                      $a true;
                      $b true;
                      $c true;    
                          
                      $value f('a',$a) ? ( f('b',$b) ? 'btrue' 'bfalse' )
                                         : ( 
                      f('c',$c) ? 'ctrue' 'cfalse' );
                                      
                      var_dump($value);
                      Rückgabe: btrue

                      Die Aufgabenstellung wäre wie beschrieben so:

                      PHP-Code:
                      $value f('a',$a) ? f('b',$b) ? 'btrue' 'bfalse'
                                         
                      f('c',$c) ? 'ctrue' 'cfalse'
                      Rückgabe: ctrue

                      Das steht und fällt wirklich mit der Klammerung der beiden Zweige.
                      Zuletzt geändert von mermshaus; 11.01.2012, 19:44.

                      Kommentar

                      Lädt...
                      X