Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [php]: $a=1; print(2*$a=10); Was erwarted ihr? (https://www.delphipraxis.net/94212-%5Bphp%5D-%24%3D1%3B-print-2%2A%24%3D10-%3B-erwarted-ihr.html)

yankee 18. Jun 2007 10:00


[php]: $a=1; print(2*$a=10); Was erwarted ihr?
 
Hi @ll,

es geht mir um folgenden Code:
Code:
$a=1;
print(2*$a=10);
Unter der Hintergrund der Operatorenpriotität:
http://www.php.net/manual/de/language.operators.php
in der steht, dass der Zuweisungsoperator eine niedrigere Priorität hat als der Multiplikationsoperator würde ich erwarten, dass das Ergbnis "2" ist. Das Ergebnis ist aber "20".
Wieso? hat es vielleicht was mit der Assoziativität der Operatoren zu tun, die auch in der Tabelle in der php-Doku steht?

Falls ihr euch jetzt fragt warum ich so einen unübersichtlichen Ausdruck überhaupt schreiben will:
Ich schreibe einen kleinen Scriptparser, der sich möglichst genau an die php-Syntax hält. Und ich überlege gerade, wie man solche Zuweisungen in einem Parser richtig umsetzt :-). und dafür will ich mal verstehen, wie php bei sowas vorgeht.

mkinzler 18. Jun 2007 10:04

Re: [php]: $a=1; print(2*$a=10); Was erwarted ihr?
 
In der Anmerkung wird aber angedeutet das Zuweisungen zu Problemen führen könnten.
Ich würde aber nicht 2 sondern 10 erwarten, bei höheren Rang der Multiplikation.

OregonGhost 18. Jun 2007 10:25

Re: [php]: $a=1; print(2*$a=10); Was erwarted ihr?
 
Hmm, die Frage ist, für welche Art von Operanden die Zuweisung überhaupt gültig ist. Du erwartest 2, weil 2 * $a 2 ergibt und die anschließende Zuweisung 2 = 10 lautet? Wenn überhaupt, wäre das Ergebnis dieser Zuweisung doch 10, wie mkinzler schreibt. Aber kann man dem Ausdruck 2 * $a überhaupt etwas zuweisen? Der Zuweisungsoperator kann sich doch eigentlich nur auf das $a beziehen und dann logischerweise auf die Version vor dem Ausdruck (2 * $a ändert den Wert von $a nicht). Das wäre jetzt meine Interpretation. Von daher würde ich ohnehin 20 erwarten.
In der Doku steht dazu:
Zitat:

Zitat von PHP
Obwohl ! einen höheren Rang gegenüber = hat, erlaubt es Ihnen PHP immer noch ähnliche Ausdrücke wie den folgenden zu schreiben: if (!$a =foo()).In diesem Ausdruck wird die Ausgabe von foo() der Variablen $a zugewiesen.

Was genau dieses Verhalten beschreibt. Die Zuweisung bezieht sich auf die Variable. Das ist wohl ein Sonderfall.

yankee 18. Jun 2007 10:43

Re: [php]: $a=1; print(2*$a=10); Was erwarted ihr?
 
Zitat:

Zitat von mkinzler
In der Anmerkung wird aber angedeutet das Zuweisungen zu Problemen führen könnten.
Ich würde aber nicht 2 sondern 10 erwarten, bei höheren Rang der Multiplikation.

Es geht mir nicht um den Wert, der in $a drin steht, sondern um den wert, der geprinted wird...

@OregonGhost:
meine Argumentation ist folgende:
Als erstes sollte php 2*$a rechnen. Dann stellt php fest, dass es noch eine Zuweisung dahinter gibt und weist $a auch noch 10 zu. --> Es wird 2 geprinted.
Stattdessen scheint es aber eher so zu sein, dass php die Zuweisung zuerst auswerted und dann erst 2*$a rechnet womit 20 geprinted wird. Und genau da ist mein Problem: Warum macht php das?

Light 18. Jun 2007 10:53

Re: [php]: $a=1; print(2*$a=10); Was erwarted ihr?
 
Zitat:

Zitat von yankee
Es geht mir nicht um den Wert, der in $a drin steht, sondern um den wert, der geprinted wird...

öhm - jetzt wäre es interessant was danach in $a drin steht!
vielleicht hilfst zu verstehen was da passiert :roll:

Zitat:

Zitat von yankee
$a auch noch 10 zu. --> Es wird 2 geprinted.

das Verstehe ich nicht!
weil der Zuweisung ist es doch egal was vorher mit $a passiert!
Also müsste doch 10 in a Drin stehen - oder?
aber ah - jetzt dämmerts mir-
es wird ja nicht $a geprintet....

also du meinst es wird zwar die 10 zugewisen aber der zuvor stehende ausdruck ( also 2*$a ) ausgegeben?
aber print gibt doch das aus was in der Klammer steht? also müsst es dies Ausdrücke erst verwerten und wenn diese alle fertig berechnet und co sind genommen werden?
was gibt print den aus wenn du nur schreibst $a=10 ?
10 oder die 1 von vorher?

irgendwie sehr sehr merkwürdig....

Leuchtende Grüße

Stefan

OregonGhost 18. Jun 2007 10:55

Re: [php]: $a=1; print(2*$a=10); Was erwarted ihr?
 
Zitat:

Als erstes sollte php 2*$a rechnen. Dann stellt php fest, dass es noch eine Zuweisung dahinter gibt und weist $a auch noch 10 zu. --> Es wird 2 geprinted.
Stattdessen scheint es aber eher so zu sein, dass php die Zuweisung zuerst auswerted und dann erst 2*$a rechnet womit 20 geprinted wird. Und genau da ist mein Problem: Warum macht php das?
2 * $a ist keine Variable, sondern lediglich ein Ausdruck mit einem Wert. Wie willst du deinem Ausdruck einen Wert zuweisen? Zuweisungen gehen nur an Variablen. Das ist ungefähr das, was in der PHP-Doku (außerordentlich unbeholfen) mit dem Beispiel beschrieben wird.

yankee 18. Jun 2007 11:21

Re: [php]: $a=1; print(2*$a=10); Was erwarted ihr?
 
Zitat:

Zitat von Light
also du meinst es wird zwar die 10 zugewisen aber der zuvor stehende ausdruck ( also 2*$a ) ausgegeben?

Das hätte ich erwarted...
Zitat:

Zitat von Light
aber print gibt doch das aus was in der Klammer steht? also müsst es dies Ausdrücke erst verwerten und wenn diese alle fertig berechnet und co sind genommen werden?

Ja... 20...
Zitat:

Zitat von Light
was gibt print den aus wenn du nur schreibst $a=10 ?

10
Zitat:

Zitat von OregonGhost
2 * $a ist keine Variable, sondern lediglich ein Ausdruck mit einem Wert. Wie willst du deinem Ausdruck einen Wert zuweisen? Zuweisungen gehen nur an Variablen. Das ist ungefähr das, was in der PHP-Doku (außerordentlich unbeholfen) mit dem Beispiel beschrieben wird.

Beispiel? Wo?
Naja... Ist schon klar, dass die 10 nur $a zugweisen wird un dnihct 2*$a
nach der ganzen Aktion steht in $a ja auch 10 drin.
Es geht mir ja nur um die Rheinfolge, wie php vorgeht. Also rechnet der erst 2*$a und dann erst $a=10 oder umgekehrt? Also offensichtlich umgekehrt. Aber nach welcher Logik umgekehrt?

Light 18. Jun 2007 11:30

Re: [php]: $a=1; print(2*$a=10); Was erwarted ihr?
 
Ganz einfach:
einzige Variable mit Zuweisung verwerten.
Danach den rest ausführen ...
Ich denke das is so ein bisschen nach dem Try-Error-Prinzip
--> Anders kann er ja nicht alle ausdrücke verwenden oder?

Leuchtende Grüße

Stefan

Luckie 18. Jun 2007 11:40

Re: [php]: $a=1; print(2*$a=10); Was erwarted ihr?
 
Also ein Sprache, die so etwas möglich macht, muss doch irgendwie etwas krank sein. :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz