Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Operacje na wskaźniku - kiedy standard określa niezdefiniowane zachowanie?

Ostatnio zmodyfikowano 2015-01-05 21:52
Autor Wiadomość
SocrateZ
» 2015-01-03 19:52:44
Cytuję:
Jeżeli
Wtedy masz rację.

Ale tutaj jest wprost powiedziane że zmienna tekst zawiera ciąg znaków: "kolorowo".
Nie jest to pobierane z klawiatury. Gdyby było przed pętlą można by było zrobić instrukcje warunkową. Kod jest jak najbardziej w tym momencie poprawny.
P-123984
Monika90
» 2015-01-03 20:06:35
Twierdzę, że jest to niezdefiniowane zachowanie, na podstawie tego http://c-faq.com/aryptr​/non0based.html

A gdyby kolejność była odwrotna to by było w porządku:
C/C++
tekst + strlen( tekst ) - 1
i byłby to wskaźnik do ostatniego znaku napisu, czyli do litery o
P-123986
SocrateZ
» 2015-01-03 20:10:33
Przecież ten kod:
tekst + strlen( tekst ) - 1

da ten sam wynik co ten:
tekst - 1 + strlen( tekst )
P-123987
DejaVu
» 2015-01-03 20:14:09
Nie. To nie jest ten sam wynik. To tak jak byś miał belkę długości 5 metrów, startowałbyś z położenia 0m, poszedł o minus 1 metr, a następnie poszedł w prawo o 3 metry. Efekt jest taki, że po wykonaniu operacji -1m spadasz z belki i te dodanie +3m nie ma już najmniejszego znaczenia (bo z niej spadłeś).

Dorzucę jeszcze fragment tego co podrzuciła Monika90:
Pointer arithmetic is defined only as long as the pointer points within the same allocated block of memory, or to the imaginary ``terminating'' element one past it; otherwise, the behavior is undefined, even if the pointer is not dereferenced.
P-123989
SocrateZ
» 2015-01-03 20:22:49
Trochę łopatologiczne tłumaczenie.
Dobrze więc dodać do zbioru kolejną ciekawostkę.

I to mnie zaskoczyło:
the behavior is undefined, even if the pointer is not dereferenced

No ale nic, człowiek uczy się na błędach.
P-123991
1aam2am1
» 2015-01-03 20:59:31
Co to robi?
c1-->c2;
P-123993
DejaVu
» 2015-01-03 21:01:55
Co to robi?
C/C++
c1-->c2;
sprawdza czy c1 > c2, a następnie dekrementuje wartość c1.
P-123994
Kaikso
» 2015-01-03 21:02:55
C/C++
int realarray[ 10 ];
int * array = & realarray[ - 1 ];

Kod nie ma takiej postaci
c1 =( & tekst[ - 1 ] )[ strlen( tekst ) ]
, tylko taką
c1 = *( tekst - 1 + strlen( tekst ) )
, nawet taka postać
c1 = *( tekst + strlen( tekst ) - 1 )
 dla większości kompilatorów powinna mieć niezdefiniowane zachowanie, ponieważ wartość
tekst - 1
 zostanie obliczona podczas kompilacji, a
strlen( tekst )
 zostanie dodana w czasie wykonania. Gdyby to było niezdefiniowanie zachowanie to większość programów była by nieprzewidywalna :P
P-123995
1 « 2 » 3 4 5 6 7 8
Poprzednia strona Strona 2 z 8 Następna strona