Ostatnio próbowałem zrobić prosty round robin z Perlem i znalazłem zachowanie, którego nie rozumiem jasno.Basic round robin w Perlu różnica między (++/+1)
Tutaj zachowanie:
my $a = {index => 0};
for (0 .. 10) {
$a->{index} = ($a->{index}++) % 2;
warn $a->{index};
}
Wyjście z tego kodu będzie:
0,0,0,..,0
Ale jeśli to zrobię "ten sam" kod zastępując $ a -> {index} ++ przez $ a -> {index} +1, okrągłe robin będzie dobrze, przykład
my $a = {index => 0};
for (0 .. 10) {
$a->{index} = ($a->{index}+1) % 2;
warn $a->{index};
}
wyjście będzie:
1,0,1,0,1,0,1,0...
Ktoś może mi wyjaśnić różnicę między ++/+1 w tym przypadku? Uważam, że jest to naprawdę "brzydkie", ponieważ jeśli nie przypiszemy wyniku do żadnej zmiennej w przypadku "++", kod będzie działał zgodnie z oczekiwaniami, chyba że wstawię sumę do środka().
ten kod zrobi karuzeli poprawnie:
my $a = {index => 0};
for (0 .. 10) {
warn $a->{index}++ % 2;
}
with() w sumie, kod wyświetli: 1,2,3,4,5,6,7,8,9
my $a = {index => 0};
for (0 .. 10) {
warn ($a->{index}++) % 2;
}
Co powiecie: '^ =' na 'xor'. Na przykład. 'if ($ x^= 1) {...' – Sobrique
Wyrażenie '$ i = $ i ++' nie zmieni wartości '$ i', ponieważ wykonujesz przypisanie' $ i = $ i' przed ma miejsce post-inkrementacja '++'. W przeciwnym razie wyrażenie '$ i = $ i + 1 'zwiększy wartość' $ i', ponieważ prawy bok '$ i + 1' jest obliczany * pierwszy * i zostaje przypisany do' $ i'. Wierzę, że to jest sedno twoich problemów. – msw