Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
Kommentar vom Moderator masterG am 28.03.2011 um 17:14:18 Uhr
Editierfunktion ist auch nützlich
GELÖST

Operator Reihenfolge - zweiter Operand

Frage Entwicklung PHP

Mitglied: nxclass

nxclass (Level 2) - Jetzt verbinden

17.03.2011, aktualisiert 28.03.2011, 3306 Aufrufe, 6 Kommentare

hallo,
ich habe schon seit geraumer Zeit mit PHP zu tun, aber scheinbar bei simplen Sachen lernt man immer was dazu.

Bitte kann mir jemand die Ergebnisse der folgenden Berechnungen erklären ?
01.
$foo = 5; 
02.
echo $foo + $foo++ + $foo ."\n"; # 5+5+6 - Ergebnis: 17 
03.
$foo = 5; 
04.
echo $foo + $foo++ ."\n"; # 5+5 (+1)? - Ergebnis: 11 
05.
$foo = 5; 
06.
echo $foo + $foo + $foo++ ."\n"; # 5+5+5 (+1)? - Ergebins: 15 
07.
$foo = 5; 
08.
echo (int) $foo + $foo++ + $foo ."\n"; # 5+5+6 - Ergebnis: 16
Der Kommentar von nxclass wurde vom Moderator am 05.12.16 ausgeblendet!
Mitglied: EvilMoe
17.03.2011 um 11:45 Uhr
$foo = 5;
echo $foo + $foo++ + $foo ."\n"; # 5+5+6 - Ergebnis: 17
5 + 6 + 6 = 17

$foo hast du ab dem 2. Operator um 1 erhöht und bleibt später natürlich so erhalten.
Besser zu verstehen wäre es vllt. so: $foo = $foo + 1 ; ist das gleiche.


$foo = 5;
echo $foo + $foo++ ."\n"; # 5+5 (+1)? - Ergebnis: 11
5 + 6 = 11
$foo ist ja 5 und erhöhst in beim 2. Operator wiede rum 1.



$foo = 5;
echo $foo + $foo + $foo++ ."\n"; # 5+5+5 (+1)? - Ergebins: 15
Mhh komisch, kann ich mir auch nicht erklären warum da 15 raus kommt und nicht 16.


$foo = 5;
echo (int) $foo + $foo++ + $foo ."\n"; # 5+5+6 - Ergebnis: 16
Passt irgentwie auch nicht in meine Logik, ich hätte auf 5+6+6 getippt.


Ich vermute mal das es ein Problem von den Typen sein kann.
Bitte warten ..
Mitglied: Guenni
18.03.2011 um 15:59 Uhr
@nxclass,

anscheinend hast du hier einen Fall (oder einen Bug ) konstruiert, den der Interpreter nicht korrekt verarbeitet, weil du immer

den selben Varablennamen verwendest.

Operatoren geben wie Funktionen ein Ergebnis zurück. Für den zusammengesetzten Operator ++ gibt es zwei Notationen:

Die Präfix-Notation (++$var) und die Postfix-Notation ($var++). Im ersten Fall wird der Variableninhalt um 1 inkrementiert und danach

das Ergebnis zurückgegeben. Im zweiten Fall wird der Variableninhalt zurückgegeben und danach inkrementiert.

01.
<?php 
02.
$foo=5; 
03.
echo $foo++."<br>"; // Ergebnis: 5, Wert wird "nach" der Ausgabe inkrementiert 
04.
echo ++$foo."<br>"; // Ergebnis: 7, Wert wurde "vor" der Ausgabe nochmal inkrementiert 
05.
?>
Was jetzt bei deinem Beispiel passiert, kann ich auch (noch) nicht nachvollziehen, aber wenn du anstatt einem Variablennamen

versch. Variablennamen verwendest, arbeiten die Operatoren auch korrekt:

01.
<?php 
02.
$foo1=5; 
03.
$foo2=5; 
04.
$foo3=5; 
05.
echo $foo1 + $foo2++ + $foo3."<br>"; //Ergebnis: 15, Wert($foo2) wird "nach" der Ausgabe inkrementiert 
06.
$foo1=5; 
07.
$foo2=5; 
08.
$foo3=5; 
09.
echo $foo1 + ++$foo2 + $foo3."<br>"; //Ergebnis: 16, Wert($foo2) wird "vor" der Ausgabe inkrementiert 
10.
$foo1=5; 
11.
$foo2=5; 
12.
$foo3=5; 
13.
echo $foo1 + $foo2 + $foo3++."<br>"; //Ergebnis: 15, Wert($foo3) wird "nach" der Ausgabe inkrementiert 
14.
$foo1=5; 
15.
$foo2=5; 
16.
$foo3=5; 
17.
echo $foo1 + $foo2 + ++$foo3."<br>"; //Ergebnis: 16, Wert($foo3) wird "vor" der Ausgabe inkrementiert 
18.
$foo1=5; 
19.
$foo2=5; 
20.
$foo3=5; 
21.
echo $foo1 + ++$foo2 + ++$foo3."<br>"; //Ergebnis: 17, Werte($foo2,$foo3) werden "vor" der Ausgabe inkrementiert 
22.
$foo1=5; 
23.
$foo2=5; 
24.
$foo3=5; 
25.
echo $foo1 + $foo2++ + $foo3++."<br>"; //Ergebnis: 15, Werte($foo2,$foo3) werden "nach" der Ausgabe inkrementiert 
26.
?>

Gruß
Günni
Bitte warten ..
Mitglied: dog
19.03.2011 um 00:30 Uhr
Die Ursache ist hier ganz einfach die Operator-Präzedenz (Das wäre übrigens eine nette Frage für einen Programmiertest ).
++ ist ein unärer Operator und bindet immer stärker als alle binären Operatoren.

Entsprechend ist die Rechnung:

echo $foo + $foo++ + $foo ."\n"; # 5+5+6 - Ergebnis: 17

01.
= ($foo + $foo++) + $foo 
02.
=   2       1        3   #Auswertungsreihenfolge 
03.
=   6   +   5     +  6
(Warum ich da jetzt klammern gesetzt habe erkläre ich unten)

echo $foo + $foo++ ."\n"; # 5+5 (+1)? - Ergebnis: 11
01.
= $foo + $foo++ 
02.
=   2  +   1     #Auswertungsreihenfolge 
03.
=   6  +   5
echo $foo + $foo + $foo++ ."\n"; # 5+5+5 (+1)? - Ergebins: 15

Der Grund ist hier, dass + ein Binärer Operator ist.
Er hat nur exakt zwei Seiten (links und rechts), PHP muss also implizit Klammern, und klammern binden immer noch stärker also unäre Operatoren.

Hier steht also:

01.
= ($foo + $foo) + $foo++ 
02.
=   1       2        3   #Auswertungsreihenfolge 
03.
=   5   +   5   +  5
Anders gesagt: Für Programmiersprachen gilt das Assoziativgesetz (Klammervertauschungsgesetz) nicht!

echo (int) $foo + $foo++ + $foo ."\n"; # 5+5+6 - Ergebnis: 16

Das Casten ist ebenfalls ein unärer Operator.
Die unären Operatoren werden wieder von links ausgewertet, weshalb folgendes passiert:

01.
= (int)($foo) + $foo++ + $foo 
02.
=       1         2       3      #Auswertungsreihenfolge 
03.
=       5     +   5    +  6
Das ist natürlich nicht zu verwechseln mit (int)($foo + $foo++ + $foo)

Frage beantwortet?

Kleine Überlegung zum Schluss:

01.
0 < 7 < 5
Kommt hier true oder false raus und warum?
Der Code funktioniert nicht in PHP, aber in C
Bitte warten ..
Mitglied: Guenni
19.03.2011 um 17:39 Uhr
Frage beantwortet?

Nöö!

01.
<?php 
02.
$foo=5; 
03.
echo $foo + $foo++ + $foo
04.
?>
Ergibt 17

01.
<?php 
02.
$foo1=5; 
03.
$foo2=5; 
04.
$foo3=5; 
05.
echo $foo1 + $foo2++ + $foo3;  
06.
?>
Ergibt 15

Auch Klammern bringt nix:

01.
<?php 
02.
$foo=5; 
03.
echo $foo + $foo++ + $foo
04.
?>

Ergibt 17


01.
<?php 
02.
$foo=5; 
03.
echo ($foo + $foo++) + $foo
04.
?>
Ergibt?? Na . . . , 17

Gruß
Günni
Bitte warten ..
Mitglied: dog
19.03.2011 um 17:44 Uhr
Ergibt 17 face-sad

Richtig, wie von mir oben erklärt

Ergibt 15 face-smile

Weil es 3 Variablen sind.
Das Postkrement wird zwar angewendet, aber gleich verworfen im Gegensatz zu oben, wo die variable nach dem Postkrement gleich noch zweimal benutzt wird!

Ergibt 17

Kein Unterschied zum ersten Beispiel?

Ergibt?? Na . . . , 17

Das ist genau das erste Beispiel mit der Klammerung, die PHP implizit selber einsetzt.


Nochmal:
  • Ein binärer Operator wie + hat nur genau EINE linke und EINE rechte Seite
  • Ein + bindet stärker als ein anderes + (von links, wenn mehrere gleichberechtigt auftreten)
  • Das Assoziativgesetz gilt hier nicht
Bitte warten ..
Mitglied: nxclass
20.03.2011 um 20:17 Uhr
Vielen Dank - deine Beschreibung hat mir nun endlich die Augen geöffnet.

Das wäre übrigens eine nette Frage für einen Programmiertest
... der steht bei mir in kürze auch an. 'Zend PHP 5.3'
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Windows Server
Zweiter DNS arbeitet (evtl.) nicht korrekt (17)

Frage von Helgomat zum Thema Windows Server ...

Verschlüsselung & Zertifikate
Bitlocker: Ist die Reihenfolge bei der Verschlüsselung wichtig (10)

Frage von cyberjunkie zum Thema Verschlüsselung & Zertifikate ...

Netzwerkgrundlagen
gelöst Zweiter Internetanschluss für Arztordination (Österreich GINA-BOX) (6)

Frage von intermarty zum Thema Netzwerkgrundlagen ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (17)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

DSL, VDSL
DSL-Signal bewerten (14)

Frage von SarekHL zum Thema DSL, VDSL ...