dedlfix: Was bewirkt ein Dollarzeichen mit geschweifter Klammer um Array?

Beitrag lesen

Hi!

Aber schon die Klammern beim return verhindern wirksam, dass eine Referenz nach außen gelangen kann.

tun sie das wirklich? Das würde ja bedeuten, dass gesetzte Klammern den Typ des Operanden verändern, &dummy wäre also etwas anderes als (&dummy) - das fände ich aber sch...

Siehe Anmerkung auf der verlinkten Handbuchseite. Das Setzen von Klammern bildet einen neuen Ausdruck. (In Konstrukten wie if, for und Funktionen sind sie syntaktischer Bestandteil und nicht Gegenstand der aktuellen Betrachtung.) Es wird also zunächst der geklammerte Ausdruck berechnet und der dann weiterverarbeitet. Der Referenz-Operator steht ja bei PHP nicht (mehr) beim return sondern im Funktionskopf. Um den Klammerausdruck berechnen zu können, wird der Wert von $foo gelesen und verwenden. Zu Berechnen ist zwar nichts weiter, das Ergebnis des Ausdrucks ist nun aber der (nicht weiter berechnete) Wert und nicht eine Referenz. Hier müsste PHP mehr Kontextanalyse treiben, um auszuwerten, a) in welcher Umgebung die Klammerung steht, und b) wie das Funktionsergebnis verwendet wird, um sie als "vermutlich ungewünscht und überflüssig" zu erkennen. Das programmiere mal! Die Alternative wäre vermutlich, Referenzvariablen immer explizit kennzeichnen zu müssen, was PHP nicht vorsieht.

Wie sieht das denn in C aus?

int *min(int a, int b)
    { if (a<b)
         return (&a);
      else
         return (&b);
    }

Hier bewusst umständlich formuliert, ohne den ternären Operator zu verwenden.
Ob ich das Argument des return-Statements in Klammern setze oder nicht, ist völlig gleichgültig, es bleibt trotzdem ein int*, also eine Referenz auf ein int.

Ich kann mir grad nicht vorstellen, wie der "Referenz-Zurückgeb-Operator" das Klammernpaar außer Gefecht setzen soll.
Tut er nicht - die Klammern haben keine Funktion, außer der Gruppierung und damit evtl. der Veränderung der Reihenfolge von Operationen. Und so hatte ich das in PHP bisher auch gesehen.

Syntaxelemente werden ja aus Sicht des Parsers nicht der Lesbarkeit willen gesetzt, sondern um ihm eine Reihenfolge aufzuzwingen. Das heißt, er muss diese Klammerung in einen Rechenschritt übersetzen. Oder er ist so intelligent, dass er die Klammern hier wegoptimieren kann. Das zu erkennen könnte hier einfacher als bei PHP sein, weil Klammern und Referenz-Operator in unmittelbarer Nähe stehen und die Verwendung der Referenz statt des Wertes nicht wie bei PHP implizit durch anderswo notierte Syntaxelemente erkannt werden muss.

Lo!