Erklärung
am 20.06.2006 22:01:49 von Oliver Block
Hi,
ich stolpere ab und zu über folgendes Problem:
$a = array( "ehne", "mehne", "muh");
print "count: " . count($a) . "
\n"; // output: 'count: 3'
print "count-1: " . count($a) -1 ; // output: '-1'
print "count-2: " . count($a) -2 ; // output: '-2'
print "(count-1): " . (count($a) -1) ; // output: '(count-1): 2'
Kann jemand erklären, warum die beiden mittleren Ergebnisse zustande kommen?
Es schein ja folgendes anzukommen:
print -1;
print -2;
Gruß,
Oliver
Re: Erklärung
am 20.06.2006 22:07:45 von Norbert Melzer
Oliver Block schrieb:
> Hi,
>=20
> ich stolpere ab und zu über folgendes Problem:
>=20
> $a =3D array( "ehne", "mehne", "muh");
> print "count-1: " . count($a) -1 ; // output: '-1'
> print "count-2: " . count($a) -2 ; // output: '-2'
Ist equivalent zu:
print ("count-1: " . count($a) ) - 1 ;
print ("count-2: " . count($a) ) - 2 ;
Vielleicht hilft Dir dieser Hinweis
Re: Erklärung
am 20.06.2006 22:08:27 von Matthias Wuebbeling
Oliver Block wrote:
> Hi,
>
> ich stolpere ab und zu über folgendes Problem:
>
> $a = array( "ehne", "mehne", "muh");
> print "count: " . count($a) . "
\n"; // output: 'count: 3'
geht!
> print "count-1: " . count($a) -1 ; // output: '-1'
Interpretiert "count-1: 3" also Zahl 0
> print "count-2: " . count($a) -2 ; // output: '-2'
Interpretiert "count-1: 3" also Zahl 0
> print "(count-1): " . (count($a) -1) ; // output: '(count-1): 2'
Interpretiert den Zahlwert 2 als String und konkatteniert ihn.
> Kann jemand erklären, warum die beiden mittleren Ergebnisse zustande kommen?
done. Passiert schonmal bei Typenlosen Sprachen :)
HTH,
Matze
Re: Erklärung
am 20.06.2006 22:10:23 von Matthias Wuebbeling
Matthias Wuebbeling wrote:
>> print "count-2: " . count($a) -2 ; // output: '-2'
>
> Interpretiert "count-1: 3" also Zahl 0
copy & paste ist böse, hinterhältig und gemein!
Meine natürlich "count-2: 3" und "als" Zahl 0
Re: Erklärung
am 20.06.2006 22:47:36 von Oliver Block
Norbert Melzer wrote:
>> $a = array( "ehne", "mehne", "muh");
>> print "count-1: " . count($a) -1 ; // output: '-1'
>> print "count-2: " . count($a) -2 ; // output: '-2'
>
> Ist equivalent zu:
>
> print ("count-1: " . count($a) ) - 1 ;
> print ("count-2: " . count($a) ) - 2 ;
Kann man diesen "Effekt" auch irgendwie positiv nutzen? Wahrscheinlich kann
man ja auch anderen Code zwischen () schreiben!? - Hier kann ja leider
nicht mehr drauf zugegriffen werden, auch wenn es im Speicher steht.
Gruß,
Oliver
Re: Erklärung
am 20.06.2006 22:56:21 von Matthias Wuebbeling
Oliver Block wrote:
> Norbert Melzer wrote:
>>> $a = array( "ehne", "mehne", "muh");
>>> print "count-1: " . count($a) -1 ; // output: '-1'
>>> print "count-2: " . count($a) -2 ; // output: '-2'
>> Ist equivalent zu:
>>
>> print ("count-1: " . count($a) ) - 1 ;
>> print ("count-2: " . count($a) ) - 2 ;
>
> Kann man diesen "Effekt" auch irgendwie positiv nutzen? Wahrscheinlich kann
> man ja auch anderen Code zwischen () schreiben!? - Hier kann ja leider
> nicht mehr drauf zugegriffen werden, auch wenn es im Speicher steht.
Vielleicht hättest du verstanden, worum es geht, wenn du dir Gedanken
dazu gemacht hättest.
Operatoren und ihre Rangfolge:
http://www.php.net/manual/de/language.operators.php
Dort und in den Unterkapiteln solltest du etwas finden.
Noch ein Tip:
3 * 4 + 1 = 13
3 * (4 + 1) = 15
lieben Gruß,
Matze
Re: Erklärung
am 20.06.2006 23:15:45 von Oliver Block
Matthias Wuebbeling wrote:
> Oliver Block wrote:
>> Norbert Melzer wrote:
>>>> $a = array( "ehne", "mehne", "muh");
>>>> print "count-1: " . count($a) -1 ; // output: '-1'
>>>> print "count-2: " . count($a) -2 ; // output: '-2'
>>> Ist equivalent zu:
>>>
>>> print ("count-1: " . count($a) ) - 1 ;
>>> print ("count-2: " . count($a) ) - 2 ;
>>
>> Kann man diesen "Effekt" auch irgendwie positiv nutzen? Wahrscheinlich
>> kann man ja auch anderen Code zwischen () schreiben!? - Hier kann ja
>> leider nicht mehr drauf zugegriffen werden, auch wenn es im Speicher
>> steht.
>
> Vielleicht hättest du verstanden, worum es geht, wenn du dir Gedanken
> dazu gemacht hättest.
Was soll die dumme Bemerkung? Hast Du ein Schweigegelübde abgelegt?
> Noch ein Tip:
>
> 3 * 4 + 1 = 13
> 3 * (4 + 1) = 15
Bist du sicher, daß Du es verstanden hast?
Nichts für ungut.
--Oliver
Re: Erklärung
am 20.06.2006 23:28:04 von Matthias Wuebbeling
Oliver Block wrote:
>> Vielleicht hättest du verstanden, worum es geht, wenn du dir Gedanken
>> dazu gemacht hättest.
>
> Was soll die dumme Bemerkung? Hast Du ein Schweigegelübde abgelegt?
Noe, dann hätte ich ja nix gesagt.
>> Noch ein Tip:
>>
>> 3 * 4 + 1 = 13
>> 3 * (4 + 1) = 15
>
> Bist du sicher, daß Du es verstanden hast?
Ja, sonst hätte ich dir nicht in zwei Antworten geschrieben, was hier
das Problem ist. Wenn du diese Hinweise nicht verstehst, dann gehe ich
davon aus, dass du dir keine Gedanken gemacht hast.
Wenn geklammerte Ausdrücke nunmal in obigem Fall zuerst ausgeführt
werden, dann hast du in deinem Ausdruck eben einen String, von dem eine
Zahl abgezogen werden soll. Dieser String ist nicht in eine Zahl zu
casten, weshalb angenommen wird, dass es sich um 0 handelt.
http://www.php.net/manual/de/language.types.string.php#langu age.types.string.conversion
für die Information. Wenn du im String _eine_ Zahl zu Beginn hast, dann
wird diese als Integerwert gesetzt. Du hast aber "-1" und "3" getrennt
von einem ":" und auch nicht am Anfang.
> Nichts für ungut.
Denke ich auch!
Matze
Re: Erklärung
am 20.06.2006 23:34:56 von Matthias Esken
On Tue, 20 Jun 2006 22:47:36 +0200, Oliver Block wrote:
>> print ("count-1: " . count($a) ) - 1 ;
>> print ("count-2: " . count($a) ) - 2 ;
>
> Kann man diesen "Effekt" auch irgendwie positiv nutzen? Wahrscheinlich kann
> man ja auch anderen Code zwischen () schreiben!? - Hier kann ja leider
> nicht mehr drauf zugegriffen werden, auch wenn es im Speicher steht.
Könntest du bitte erklären, was du eigentlich wissen möchtest?
Welchen "Effekt" meinst du? Was genau steht bitte im Speicher?
Lies mal das folgende Kapitel in der FAQ:
1.17. Wie stelle ich meine Frage an die Newsgroup am sinnvollsten?
http://www.php-faq.de/q/q-newsgroup-fragen.html
Gruß,
Matthias
Re: Erklärung
am 21.06.2006 00:40:58 von Oliver Block
Matthias Wuebbeling wrote:
>>> print "count-2: " . count($a) -2 ; // output: '-2'
>>
>> Interpretiert "count-1: 3" also Zahl 0
>
> Meine natürlich "count-2: 3" und "als" Zahl 0
Rein logisch vom Ergebnis her, könnte man das annehmen. Da -1, bzw. -2
ausgegeben wird, MUSS "das davor" als 0 interpretiert werden.
Ich denke aber eher, php interpretiert den Begriff überhaupt nicht als Zahl,
sondern als Zeichenkettenliteral.
Führe mal folgendes aus:
print ("count-1: " . count($a) );
print "
\n";
print ("count-1: " . count($a) )-1;
print ("Käsekuchen") -1;
Zeile 1 gibt eine Zeichenkette aus.
Warum sollte diese Zeichenkette in Zeile 3 zu einer 0 werden? Ich denke
eher, daß die Zeichenkette irgendwo im Speicher steht und print folgendes
interpretiert:
print -1;
Folgendes hilft weiter:
print ( $d = "Weltmeister?") -1;
print "d: {$d}";
Gruß,
Oliver
Re: Erklärung
am 21.06.2006 00:56:02 von Matthias Wuebbeling
Oliver Block wrote:
> Ich denke aber eher, php interpretiert den Begriff überhaupt nicht als Zahl,
> sondern als Zeichenkettenliteral.
Zumindest so lange, bis der Parser am "-" ankommt. Mathematische
Operatoren gehen nicht mit Zeichenkettenliteralen um.
> Führe mal folgendes aus:
>
>
> print ("count-1: " . count($a) );
> print "
\n";
> print ("count-1: " . count($a) )-1;
> print ("Käsekuchen") -1;
>
> Zeile 1 gibt eine Zeichenkette aus.
Das ist richtig!
> Warum sollte diese Zeichenkette in Zeile 3 zu einer 0 werden? Ich denke
> eher, daß die Zeichenkette irgendwo im Speicher steht und print folgendes
> interpretiert:
Nein! Und wenn du meine anderen Postings gelesen hättest und
http://www.php.net/manual/de/language.types.string.php#langu age.types.string.conversion
gelesen hättest, dann hättest du folgenden Satz gefunden:
"Sofern der String mit gültigen numerischen Daten beginnt, werden diese
als Wert benutzt. Andernfalls wird der Wert 0 (Null) sein"
> print -1;
Weil 0 - 1 = -1 ist!
> Folgendes hilft weiter:
>
> print ( $d = "Weltmeister?") -1;
> print "d: {$d}";
Hier passiert doch nix! Warum glaubst du mir nicht einfach? Also nochmal
langsam:
print ( $d = "Weltmeister?") -1;
($d = "Weltmeister?" weist der Variablen $d den Wert "Weltmeister?" zu.
Bei $d handelt es sich um einen String. Dann kommt der Parser zu -1.
Dort wird nun also "Weltmeister?" (Rückgabewert der Zuweisung)
_versucht_ in einen Zahlenwert (Integer) zu verwandeln. Das klappt nicht
(s.o.) weshalb 0 angenommen wird. 0 - 1 = -1. Durch print wird die Zahl
-1 wieder in einen String gewandelt, und dann dort ausgegeben.
print "d: {$d}";
Gibt die Zeichenkette d: ("Weltmeister?") aus. Das kann ich noch im
Kopf, ohne zu probieren. Die Variable $d ist seit der Zuweisung immer
ein String geblieben. Da in doppelten ' diese Variablen ausgewertet
werden, steht also der String in den Klammern. Wenn du einfache '
benutzt, wirst du feststellen, dass dort nicht "Weltmeister?" steht,
sondern $d:
print 'd: ($d)';
Vielleicht solltest du den Rat befolgen, wenn er dir gegeben wird und
_endlich_ mal einen Blick in die PHP Dokumentation werfen.
Lieben Gruß und gute Nacht,
Matze
Re: Erklärung
am 21.06.2006 23:40:20 von Oliver Block
Matthias Wuebbeling wrote:
>> Warum sollte diese Zeichenkette in Zeile 3 zu einer 0 werden? Ich denke
>> eher, daß die Zeichenkette irgendwo im Speicher steht und print folgendes
>> interpretiert:
>
> Nein! Und wenn du meine anderen Postings gelesen hättest und
Die Zeichenkette steht sogar gangz sicher irgendwo im Speicher. Für immer
verloren. Es sei denn, castings in php funktoinieren derart, daß der
Originalwert überschrieben wird.
Außerdiem habe ich alle Postings in diesem Thread gelesen. Aber egal.
>> Folgendes hilft weiter:
>>
>> print ( $d = "Weltmeister?") -1;
>> print "d: {$d}";
>
> Hier passiert doch nix!
Doch, es zeigt, daß die Zeichenkette im Speicher steht. In diesem Beispiel
kann man sogar darauf zugreifen, weil ich sie einer Variablen zugewiesen
habe.:)
Das kann man übrigens beliebig erweitern. Aber ob ich das als positives
Nutzen des "Effektes" (des Parsingverhaltens) werten soll - naja. Ist wohl
eher Spielerei.
> Dort wird nun also "Weltmeister?" (Rückgabewert der Zuweisung)
> _versucht_ in einen Zahlenwert (Integer) zu verwandeln. Das klappt nicht
> (s.o.) weshalb 0 angenommen wird. 0 - 1 = -1.
O.K.
Gruß,
Oliver
Re: Erklärung
am 21.06.2006 23:42:21 von Oliver Block
Matthias Esken wrote:
> Lies mal das folgende Kapitel in der FAQ:
>
> 1.17. Wie stelle ich meine Frage an die Newsgroup am sinnvollsten?
> http://www.php-faq.de/q/q-newsgroup-fragen.html
Vielleicht gelegentlich.:)
Gruß,
Oliver
Re: Erklärung
am 21.06.2006 23:55:37 von Matthias Wuebbeling
Oliver Block wrote:
> Das kann man übrigens beliebig erweitern. Aber ob ich das als positives
> Nutzen des "Effektes" (des Parsingverhaltens) werten soll - naja. Ist wohl
> eher Spielerei.
Auf die Erweiterung bin ich gespannt. Aber ich weise dich nochmal darauf
hin, dass es sich hierbei nicht um einen "unerklärlichen" Effekt
handelt, sondern um Absicht. Es geht allein um die Klammersetzung bei
deiner Subtraktion.
>> Dort wird nun also "Weltmeister?" (Rückgabewert der Zuweisung)
>> _versucht_ in einen Zahlenwert (Integer) zu verwandeln. Das klappt nicht
>> (s.o.) weshalb 0 angenommen wird. 0 - 1 = -1.
>
> O.K.
Freut mich. Ein Garbage-Collector sammelt übrigens den nicht
referenzierten (also einer Variablen zugewiesenen) Datenmüll ein und
gibt den Speicher wieder frei. Das müsstest du bei C selbst machen.
Lies dazu;
Resource
http://de.php.net/manual/de/language.types.resource.php
und dort den Punkt "Freigabe von Ressourcen".
Lieben Gruß,
Matze
Re: Erklärung
am 21.06.2006 23:59:35 von Norbert Melzer
Oliver Block schrieb:
>>> Folgendes hilft weiter:
>>>
>>> print ( $d =3D "Weltmeister?") -1;
>>> print "d: {$d}";
>> Hier passiert doch nix!
>=20
> Doch, es zeigt, daà die Zeichenkette im Speicher steht. In diesem =
Beispiel
> kann man sogar darauf zugreifen, weil ich sie einer Variablen zugewiese=
n
> habe.:)
Klar steht sie im Speicher... Denn bei der Zeichenkette "Weltmeister"
handelt es sich um eine Literalkonstante, und eine solche belegt immer
Speicher, sie kann ja nicht überschrieben werden. Das hat jetzt auch=
nix
damit zu tun ob du den Wert einer Variablen zuweist oder nicht, denn:
'($d=3D"Weltmeister?")-1;' !===3D '("Weltmeister")-1'
Denn im zweiten Teil weist Du ja den Weltmeister nirgends anders zu, es
steht zwar noch im Speicher aber es kann nicht mehr darauf zu gegriffen
werden.
Etwas anderes wäre eine Dynamische Zeichenkette (eifach oben mal
"Weltmeister" durch eine Funktion randomText() ersetzen. Der
Rückgabewert wäre im ersten Fall der Variable $d zugewiesen und=
belegt
Speicher, Ergebniss der gesammten Formel ist -1. Beim zweiten Fall wü=
rde
der Rückgabewert von randomText() bis zum abarbeiten der Formel zwar=
Speicher belegen, aber je nachdem wie PHP das Memoryhandling handhabt
sollte dieser Bereich nach Berechnen der Formel (Ergebnis übrigens
wieder -1) wieder neu vergeben werden können. Das heiÃt selbst =
wenn Du
es schaffen würdest direkt an der entsprechenden Stelle im Speicher =
zu
lesen, könnte dort inzwischen schon der Inhalt von
$IWereInitialisedAfterTheRandomTextThingi stehen.
Re: Erklärung
am 22.06.2006 01:32:34 von Oliver Block
Matthias Wuebbeling wrote:
> Aber ich weise dich nochmal darauf
> hin, dass es sich hierbei nicht um einen "unerklärlichen" Effekt
> handelt, sondern um Absicht.
Natürlich nicht. Die hat ja bereits Norbert in seiner ersten Antwort
geliefert.
Gruß,
Oliver
Re: Erklärung
am 22.06.2006 09:25:47 von Matthias Wuebbeling
Oliver Block wrote:
>> Aber ich weise dich nochmal darauf
>> hin, dass es sich hierbei nicht um einen "unerklärlichen" Effekt
>> handelt, sondern um Absicht.
>
> Natürlich nicht. Die hat ja bereits Norbert in seiner ersten Antwort
> geliefert.
"Natürlich nicht" was?
"Die" was "hat ja bereits Norbert geliefert"?
Da dies alles ist, was du sagst gehe ich nun also richtig in der
Annahme, dass du den Teil von php und anderen Programmiersprachen
verstanden hast?
Bis dann,
Matze