"kierunek" estymacji liczb w printf()

"kierunek" estymacji liczb w printf()
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 :)

edytowany 1x, ostatnio: flowCRANE
SA
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 3 godziny
  • Postów:1435
0

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

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 dni
  • Lokalizacja:Szczecin
4

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


Zobacz pozostały 1 komentarz
DR
Sequence pointem będą tutaj dodatkowe zmienne tak? Aby te skutki uboczne postinkrementacji zniknęły?
kq
Nie, średniki ;​)
DR
Czyli jednym printfem nie da rady wypisać tych kilku inkrementacji?
kq
Bezpośrednio - nie. Możesz opakować tę zmienną w funkcję, albo użyć preinkrementacji. Chociaż nie jestem pewien w C, C++ ma to trochę inaczej sformułowane. Ale nawet jeśli jest to zdefiniowane, to kolejność wywołania już nie.
DR
Dzięki za informacje :)
0

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

SA
Niektórym wydaje się, że płaska ziemia ma sens.
AK
Dywagacje o małej endianie tutaj nie mają sensu. Komus się wydaje, że wie
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 dni
  • Lokalizacja:Szczecin
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.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 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.


0

Ok dzięki za wyjaśnienia!

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12171
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.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE

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.