Inkrementoperator in Perl gibt seltsames Ergebnis

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
I.C.Wiener
Beiträge: 674
Registriert: 19.08.2003 18:45:35

Inkrementoperator in Perl gibt seltsames Ergebnis

Beitrag von I.C.Wiener » 17.01.2007 18:56:24

Hi,

ich habe gerade etwas mit dem Inkrementoperator herum gespielt und dabei gesehen, dass Perl diesen an einer Stelle etwas seltsam interpretiert.

Testprogramm:

Code: Alles auswählen

#!/usr/bin/perl

$i = 5;
print "\ni++: ", $i++; # ergibt 5
$i = 5;
print "\ni + i++: ", $i + $i++; # ergibt 11
$i = 5;
print "\ni + i + i++: ", $i + $i + $i++; # ergibt 15
exit(0);
Kann mir jemand erklären, warum beim zweiten Ausdruck "11" raus kommt?
In C++ und Java ergibt dieser Ausdruck hier "10", was ich auch logisch finde.

MfG
Who is... LAIN?

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von goeb » 17.01.2007 19:37:13

perldoc meint dazu:
perlop hat geschrieben:Note that just as in C, Perl doesn't define when the variable is incremented or decremented. You just know it will be done sometime before or after the value is returned. This also means that modifying a variable twice in the same statement will lead to undefined behaviour. Avoid statements like:

Code: Alles auswählen

$i = $i ++;
print ++ $i + $i ++;
Perl will not guarantee what the result of the above statements is.
MfG, goeb

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 17.01.2007 19:39:47

Ok, goeb hat die Antwort zwar schon geliefert, aber seltsam ist das ganze schon, dass mal so und mal so gehandelt wird.
Oh, yeah!

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von goeb » 17.01.2007 20:56:35

Ich wußte das auch nicht bis ich I.C.Wieners Script getestet habe. Ich hätte mir wahrscheinlich auch nie die Doku zum Inkrement/Dekrement-Operator durchgelesen, eigentlich ist ja klar was er machen soll. Aber gut zu wissen das man darauf aufpassen muß. Naja, ist eben Perl :D

MfG, goeb

Benutzeravatar
I.C.Wiener
Beiträge: 674
Registriert: 19.08.2003 18:45:35

Beitrag von I.C.Wiener » 17.01.2007 21:15:39

Moin,

danke für den Hinweis, dass die Perl-Doku ziemlich gut ist. ;)
Interessant finde ich, dass das Verhalten entgegen der Darstellung in der Doku eben in C sehr wohl definiert ist.
Aber das könnte in C99 gekommen sein.

Ich finde es nur etwas schade. Das so etwas in C vorkommt, ist historisch nachvollziehbar. Perl ist zu neu um mit Performancegründen oder Unwissenheit zu argumentieren. Python hat es da schöner gemacht und i++ einfach rausgeschmissen (nur ++i ist gültig). ;)

Weiß jemand, wie Perl6 das behandelt?

Naja, jedenfalls gut zu wissen. Danke für die Aufklärung.

MfG
Who is... LAIN?

Antworten