[c++]roznica w wypisywaniu printf

0

Witam, mam jedno pytanie. Dlaczego wystepuje roznica w dwoch sposobach wypisywania funkcja printf

char tab[3] = {'x','y', 'z'};
char *wsk = tab;
char *wsk2 = tab;

printf( "%c %c %c \n", *wsk++, *wsk++, *wsk++ ) ;

for(int i = 0; i < 3; i++){
	printf( "%c " , *wsk2++);
}

Jak widac mamy ustawione dwa wskazniki na poczatek tej samej tablicy. Wiec dlaczego wynik jest rozny? A dokladnie mowiac to odwrotny0_o Oto wynik:

z y x
x y z 
0

Bo pierwsza metoda jest niepoprawna. Albo inaczej: zależna od implementacji. Równie dobrze mogłoby być x,x,x albo z,z,z
Skąd wiesz w jakiej kolejności i kiedy te wyrażenia zostaną obliczone?
Tak samo jak nie pisze się
i++++ czy jakiegoś ++i++

0
Shalom napisał(a)

Bo pierwsza metoda jest niepoprawna. Albo inaczej: zależna od implementacji. Równie dobrze mogłoby być x,x,x albo z,z,z
Skąd wiesz w jakiej kolejności i kiedy te wyrażenia zostaną obliczone?
Tak samo jak nie pisze się
i++++ czy jakiegoś ++i++

ok, dzieki za odpowiedz.
sadzilem ze sie uda to jakos wyjasnic .... np przez piorytet operatorow lub kolejnosc wykonywania rzeczy w printf.
no ale nic, faktycznie cos jest nie tak z ta funkcja/obliczeniami. jak zamiast *wsk++ wpisalem (*wsk= *wsk +1) to juz naprawde sie krzaczy. dziwne, zawsze sadzilem ze rzeczy podczas wywolywania fukcji sa liczone od lewej do prawej jak w normalnych dzialaniach matematycznych.

0

Ot, trafiłeś na kolejny przypadek, w którym C jest powalone: żeby kolejność obliczania parametrów nie była zdefiniowana? No litości...

0

Ja kiedyś sporo czasu straciłem na debugowaniu czegoś w rodzaju:

double x = 1.0;
cout << x / ++x << endl;      // 1.0 / 2.0 = 0.5 ?

tylko bardziej skomplikowanego.

Nigdzie się nie spotkałem z kolejnością obliczania licznika i mianownika w c++. Być może faktycznie kompilatorowi jest w ten sposób łatwiej, ale ja byłem święcie przekonany, że wykonuje on te obliczenia "po ludzku". Olśnienie przyszło, gdy rozbiłem to działanie na zmienne: licznik, mianownik i wynik i samo się naprawiło.

Co ciekawe w C# obliczenia wykonywane są już "normalnie".

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