Schrift
[thread]7275[/thread]

PERL vs. C: gleicher Code, anderes Ergebnis



<< |< 1 2 3 4 5 >| >> 48 Einträge, 5 Seiten
docsnyder
 2005-09-14 16:16
#57959 #57959
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
esskar
 2005-09-14 17:02
#57960 #57960
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=docsnyder,14.09.2005, 14:16]guckst Du hier ...[/quote]
schon witzig...
hätt ich nicht gedacht...
ich hätt' mich auch auf mein C verlassen;
damit es auch für die besserwisser verständlicher wird

Code: (dl )
1
2
3
my $n = 0;
my $i = $n++;
print $i, "\n";
vayu
 2005-09-14 17:04
#57961 #57961
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
naja esskar mit deiner methode ist klar, dass $i=0 ist.

dass aber $n = $n++ ebenfalls 0 ist, das ist merkwürdig.
esskar
 2005-09-14 17:11
#57962 #57962
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=vayu,14.09.2005, 15:04]naja esskar mit deiner methode ist klar, dass $i=0 ist.[/quote]
stimmt wohl! :)
Strat
 2005-09-14 17:26
#57963 #57963
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=vayu,14.09.2005, 15:04]dass aber $n = $n++ ebenfalls 0 ist, das ist merkwürdig.[/quote]
das finde ich ein echt schoenes Beispiel, dass perl durch seine abstraktheit sicherer als C ist. Wo C ohne Ruecksicht auf Verluste auf irgendwelchen Speicheradressen rumroedelt und Variablen veraendert, die es gar nicht veraendern darf, bleibt perl sauber... ich tendiere sogar dazu, das fuer einen Bug in C zu halten... was meint ihr?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pKai
 2005-09-14 17:35
#57964 #57964
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
perldoc perlop sagt ja, dass ++ stärker bindet als =. Da Post-++ den ursprünglichen Wert zurückliefert, erwartet ich auch logischerweise in Perl, dass sich $n = $n++; wie eine NOP verhält.
Wenn ich die Aussage in perl.de/forum richtig verstehe, verhält sich C also so, als ob ($n=$n)++ ausgeführt wird (übrigens auch unter Perl ein gültiger Ausdruck! ).
Da ich schon ewig nicht mehr mit C gearbeitet habe, ist mir auch die entsprechende Doku schon länger entfleucht.
Offensichtlich kommt mir (schon alleine deshalb) die Perl-Sichtweise natürlicher vor ;)
I sense a soul in search of answers.
vayu
 2005-09-14 17:42
#57965 #57965
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
ok gehen wir eine Stufe weiter ;)

Code: (dl )
1
2
3
4
5
#!/usr/bin/perl
$n = 0;
$m = 1;
$n = $n++ + $m++;
printf("n: $n, m: $m \n");


Ausgabe: n: 1, m: 2
vayu
 2005-09-14 17:47
#57966 #57966
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
achja hab grad mal das C-Snippet übersetzt und bei mir hier in der Firma kommt 0 raus.
docsnyder
 2005-09-14 17:47
#57967 #57967
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Na ja, daß '$n = $n++' Null liefert, kann man so oder so sehen: Da der Inkrement nach der Zuweisung ausgeführt wird, spricht dafür, daß die Null zugewiesen wird. Wenn aber der Inkrement ausgeführt wird, würde man doch erwarten, daß er sich auf die gleiche Speicheradresse bezieht (wie es ja auch in C der Fall ist). Ansonsten hätte man 2 unabhängige Instanzen einer logischen Variablen. Weiter muß man sich dann fragen, was denn bitteschön in aller Welt durch den Inkrement schließlich hochgezählt wird, wenn nicht $n.

Vor vielen vielen Jahren habe ich sogar sowas

Code: (dl )
++n++ = ++n++;


durch den C-Compiler gekriegt. Und, wer hätte das gedacht: das Ergebnis war Compiler-abhängig. Eben wohl deshalb, weil eben schwer zu sagen ist, wie solche Konstrukte auszuwerten sind.

Interessant find ich's trotzdem.

Gruß, Doc
Relais
 2005-09-14 18:01
#57968 #57968
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=docsnyder,14.09.2005, 15:47]...würde man doch erwarten, daß er sich auf die gleiche Speicheradresse bezieht (wie es ja auch in C der Fall ist). Ansonsten hätte man 2 unabhängige Instanzen einer logischen Variablen. Weiter muß man sich dann fragen, was denn bitteschön in aller Welt durch den Inkrement schließlich hochgezählt wird, wenn nicht $n.[/quote]
Perl bezieht sich eben nicht auf physikalische Dinge wie etwa Speicheradressen. Zum Perl verstehen ist es besser, sich von der Idee ganz zu lösen.

Hier ist mehr ein ideeller Raum, und in dem wurde ein $n sich selbst zugewiesen, dabei wurde der Wert Null übergeben.
Da das Postinkrement nach der Übergabe erfolgt, darf es das $n, an das soeben ein Wert übergeben wurde nicht mehr betreffen, in einem Sandkasten wird also ein anderes $n um 1 hochgezählt, aber das wird gleich wieder vergessen, weil es doch nicht weiter bedeutsam ist.

Was sollte es auch sonst tun? Würde es nach der Zuweisung nochmals auf das bestehenbleibende $n zugreifen, dann würde die Zuweisung ja nicht korrekt funktionieren. Dies nicht der Postinkrementanweisung zu opfern war wohl eine Designentscheidung. Da ich Perl gewöhnt bin, erscheint diese mir nur natürlich... aber das liegt wohl auch stark an der Konditionierung.

Code: (dl )
$n = ++$n++
dagegen ergibt einen syntax error.
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
<< |< 1 2 3 4 5 >| >> 48 Einträge, 5 Seiten



View all threads created 2005-09-14 16:16.