[C++] Operacje na wskaźniku - kiedy standard określa niezdefiniowane zachowanie?
Ostatnio zmodyfikowano 2015-01-05 21:52
SocrateZ |
» 2015-01-03 19:52:44 Cytuję: 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. |
|
Monika90 |
» 2015-01-03 20:06:35 Twierdzę, że jest to niezdefiniowane zachowanie, na podstawie tego http://c-faq.com/aryptr/non0based.htmlA gdyby kolejność była odwrotna to by było w porządku: tekst + strlen( tekst ) - 1
i byłby to wskaźnik do ostatniego znaku napisu, czyli do litery o |
|
SocrateZ |
» 2015-01-03 20:10:33 Przecież ten kod: tekst + strlen( tekst ) - 1 da ten sam wynik co ten: tekst - 1 + strlen( tekst ) |
|
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.
|
|
|
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. |
|
1aam2am1 |
» 2015-01-03 20:59:31 Co to robi? c1-->c2; |
|
DejaVu |
» 2015-01-03 21:01:55 sprawdza czy c1 > c2, a następnie dekrementuje wartość c1. |
|
Kaikso |
» 2015-01-03 21:02:55 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 |
|
1 « 2 » 3 4 5 6 7 8 |