Czemu jedna z konstrukcji nie działa ?

0

Cześć. Otóż mam 2 konstrukcje:

 znak = *(str++); 

i

znak = *(str+1); 

Drug z nich się kompiluje bez problemów natomiast w pierwszej wyskakuje błąd :"lvalue required as increment operand". znak to char, a str to tablica char. Ktoś może mi to wyjaśnić.

3

Prawdopodobnie próbujesz zrobić coś w stylu

char T[10];
++T;

natomiast nie można sobie tak "przesuwać" tablicy. W ogóle dziwne te Twoje operacje, dlaczego jak człowiek nie napiszesz str[1]?

0

Dobra jasne, a zakładając że str jest wskaźnikiem na, powiedzmy, I element jakiejś tablicy to czemu

 znak = *(str++); 

i znak = *str++;

 dają ten sam rezultat?
4

Operatory mają jakieś swoje priorytety. Pytanie jest równoznaczne do:
"dlaczego 1 + 2 * 3 jest równe 1 + (2 * 3)"
No dlaczego, że mnożenie ma większy priorytet. W Twoim przykładzie większy priorytet ma operator ++, stąd ** oba ** zapisy znaczą:
(znak = (*(str++)));
http://en.cppreference.com/w/cpp/language/operator_precedence

Dokładniejsze wyjaśnienie pierwszego pytania. Rozważmy char T[10]. T jest niewątpliwie typu glvalue char [10]. Dla tego typu (oraz wszelkich typów "tablicowych") nie można zastosować operator ++. Zatem przy zapisie ++T ma miejsce konwersja T na typ prvalue char * (implicit array-to-pointer conversion). Na obiekcie rvalue nie możemy jednak wykonać operator ++, stąd gcc mówi "lvalue required as increment operand".
http://melpon.org/wandbox/permlink/8p12hJZyzmpeqI0S

0

Oki, po prostu pomyliło mi się że zakończenie operacji w nawiasie jest też punktem sekwencyjnym.

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