"kierunek" estymacji liczb w printf()

0
#include <stdio.h>

int main(void)
{
    int liczba = 0;
    printf( "%d %d %d %d %d \n", liczba++, liczba++, liczba++, liczba++, liczba++ );
}

Programik jak powyżej. Okazuje się, że output jest 4 3 2 1 0, a nie 0 1 2 3 4.

Moje pytanie brzmi - skąd się to bierze i czy ma jakikolwiek związek z endianą (bo na małej endianie to ma niby sens taka estymacja "od końca")? Dziękuję za pomoc i pozdrawiam :)

0

Zgodnie ze standardem nie ma określonej kolejności ewaluacji argumentów funkcji, więc nie powinieneś ani na tym polegać.

4

Wielokrotne modyfikacje tej samej wartości bez sequence pointa pomiędzy nimi to UB. Tutaj może zdarzyć się wszystko.

0

Jeśli to jest niezdefiniowane to czemu o to na rekrutacji pytają :(
Teoria z małą endianą wydawała się mieć sens.

2

Jak oczekują innej odpowiedzi na UB to nie mają pojęcia o czym mówią.

0

Pomijając rekrutacyjne haczyki, czy to znaczy, że jeżeli piszemy prawdziwy program, to nigdy nie powinniśmy robić czegoś takiego jak dawać "równania" w printf() i dawać tylko same zmienne? To dziwnie brzmi po polsku ale mam nadzieję, że wiadomo o co chodzi.

1

Proste rzeczy jeszcze tak, ale często powinno się programować pod względem czytelności kodu, a nie czegokolwiek innego. Takie haczyki czytelne nie są. Ponadto, produkcyjnie jeśli 2x modyfikujesz w jednym wyrażeniu tę samą wartość to robisz coś bardzo źle. Czyli chyba to co napisałeś jest poprawne.

0

Ok dzięki za wyjaśnienia!

1

W sumie to i tak i nie – można zrobić postinkrementację argumentu w printf, bo tu niespodzianek nie będzie. Problemem jest wielokrotne użycie tej samej zmiennej w połączeniu z inkrementacją w jednym wywołaniu funkcji. W takim przypadku przydadzą się dodatkowe zmienne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1