Was sollte die Ausgabe von echo ++ $ a + $ a ++ [doppelt] sein

8

Im PHP-Handbuch Operatoren-Vorrang-Abschnitt gibt es dieses Beispiel:

%Vor%

Ich verstehe, dass das Verhalten aus folgendem Grund undefiniert ist:

Seit x + y = y + x kann der Interpreter x und y in beliebiger Reihenfolge für die Addition auswerten, um Geschwindigkeit und / oder Speicher zu optimieren. Ich schloss das nach dem Blick auf die C Codebeispiel in diesem Artikel .

Meine Frage ist, dass die Ausgabe des oben erwähnten PHP-Codes 4 sein sollte, egal wie der Ausdruck und die Unterausdrücke ausgewertet werden:

  • op1 = ++ $ a = & gt; $ a = 2, op1 = 2; op2 = $ a ++ = & gt; op2 = 2, $ a = 3; 2 + 2 = 4
  • op1 = $ a ++ = & gt; op1 = 1, $ a = 2; op2 = ++ $ a = & gt; op2 = 3, $ a = 3; 1 + 3 = 4

Woher kommt die 5? Oder sollte ich mehr darüber erfahren, wie die Operatoren funktionieren?

Bearbeiten:

Ich habe Incrementing / Decrementing Operators Abschnitt angesehen, konnte aber immer noch nicht herausfinden warum 5.

  

++ $ a: Pre-increment - Erhöht $ a um eins, dann gibt $ a zurück.
  $ a ++: Post-Inkrement - Gibt $ a zurück, dann erhöht $ a um eins.

    
Salman A 02.01.2013, 07:21
quelle

3 Antworten

5
%Vor%

$ a wird anfänglich auf 1 gesetzt. Das + + + a präinkminiert dann $ a, bevor es in der Formel verwendet wird, setzt es auf 2 und drückt diesen Wert auf den Lexer-Stapel. Das $ ++ wird dann ausgeführt, weil Incrementor einen höheren Vorrang hat als +, und dieser Wert wird auch auf den Lexer-Stack übertragen; und die Addition, die dann stattfindet, addiert das Ergebnis des Lexer-Stapels zu dem Ergebnis des Lexer-Stapels 3, was ein Ergebnis von 5 ergibt, das dann wiederholt wird. Der Wert von $ a, sobald die Zeile ausgeführt wurde, ist 3.

ODER

%Vor%

$ a wird anfänglich auf 1 gesetzt. Wenn die Formel analysiert wird, setzt das + $ ein $ l vor, um es auf 2 zu setzen, bevor es in der Formel verwendet wird (das Ergebnis wird auf den Lexer-Stapel geschoben). Das Ergebnis aus dem Lexer-Stapel und der aktuelle Wert von $ a werden dann addiert, was 4 ergibt; und dieser Wert wird wiederholt. Schließlich wird $ a nachinkrementiert, was einen Wert von 3 in $ a zurücklässt.

    
Mark Baker 02.01.2013 07:26
quelle
1

Ja, Sie erhalten 5, weil der Operator auf der rechten Seite zuerst nach seiner Priorität / Präzedenz arbeitet und danach der Operator sum (+). Also macht das erste Inkrement es zu 2 und das zweite macht es zu 3 und danach werden beide summieren und geben Sie das Ergebnis als 5

aus %Vor%

++$a gibt als 2 aus

$a++ wird nur als 2 3 ausgegeben, aber intern wird es inkrementiert.

schliesslich kommt sum als 2 + 3 = 5

vor     
Vinoth Babu 02.01.2013 07:29
quelle
0

Mark, ich glaube, du liegst falsch!

Post-increment: Gibt $ a zurück und erhöht dann $ a um eins. (aus der Dokumentation)

Also gibt es keine Möglichkeit, $ einen Wert von 3 in der Summenoperation zu erhalten.

    
TomTom 02.01.2013 08:49
quelle