"kierunek" estymacji liczb w printf()

"kierunek" estymacji liczb w printf()
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
#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 :)

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1452
0

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

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
4

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

  • Rejestracja: dni
  • Ostatnio: dni
0

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

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
2

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

  • Rejestracja: dni
  • Ostatnio: dni
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.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
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.

  • Rejestracja: dni
  • Ostatnio: dni
0

Ok dzięki za wyjaśnienia!

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.