AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [php]: $a=1; print(2*$a=10); Was erwarted ihr?

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

Ein Thema von yankee · begonnen am 18. Jun 2007 · letzter Beitrag vom 18. Jun 2007
Antwort Antwort
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#1

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

  Alt 18. Jun 2007, 11:00
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.
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 18. Jun 2007, 11:04
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.
Markus Kinzler
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#3

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

  Alt 18. Jun 2007, 11:25
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 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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#4

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

  Alt 18. Jun 2007, 11:43
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?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von Light
Light

Registriert seit: 3. Feb 2006
Ort: Paderborn NRW
123 Beiträge
 
Turbo Delphi für Win32
 
#5

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

  Alt 18. Jun 2007, 11:53
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

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
Stefan
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#6

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

  Alt 18. Jun 2007, 11:55
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#7

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

  Alt 18. Jun 2007, 12:21
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 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 von Light:
was gibt print den aus wenn du nur schreibst $a=10 ?
10
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?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von Light
Light

Registriert seit: 3. Feb 2006
Ort: Paderborn NRW
123 Beiträge
 
Turbo Delphi für Win32
 
#8

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

  Alt 18. Jun 2007, 12:30
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
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

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

  Alt 18. Jun 2007, 12:40
Also ein Sprache, die so etwas möglich macht, muss doch irgendwie etwas krank sein.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:44 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