co robi ten for?
Ostatnio zmodyfikowano 2016-05-04 22:28
skibixd Temat założony przez niniejszego użytkownika |
co robi ten for? » 2016-05-04 08:29:46 Witam, mam taki programik #include <iostream> #include <cstring>
using namespace std;
int main() { char * s = new char[ 50 ]; cin >> s; for( char * i = s + strlen( s ) - 1; i >= s; i-- ) { cout << *( i ); } delete[] s; return 0; } Program podaje na wyjście odwrócony wyraz podajny na wejście. Co się dzieje w tym forze? Dlaczego jest char*i? i on się równa s(słowo) plus długość tego słowa? Czy źle to rozumiem? |
|
carlosmay |
» 2016-05-04 09:01:35 Iteruje od końca po łańcuchu znaków. char * to wskaźnik. const char * napis = "napis"; std::cout << *( napis + 1 ); std::cout << napis[ 1 ]; } Zapisy równoważne. |
|
Monika90 |
» 2016-05-04 09:40:35 Program ma niezdefiniowane zachowanie. Po ostatnim wykonaniu ciała pętli wskaźnik i jest zmniejszany o jeden przez co wskazuje na element przed początkiem tablicy. Takie wskaźniki są nielegalne.
|
|
j23 |
» 2016-05-04 10:09:43 A co tu jest nielegalnego? Dopóki nie dobiera się do pamięci spod tego wskaźnika, to wszystko jest ok. |
|
Kaikso |
» 2016-05-04 12:16:46 Kompilator w ramach optymalizacji może przebudować pętle i mimo wszystko dobrać się do tej pamięci. To jest teoria. W praktyce jeszcze się z takim czymś nie spotkałem. #include <iostream>
int main() { int * ptr = 0xAB12CD34; std::cout << ptr << std::endl; return 0; }
Według standardu ten program ma niezdefiniowane zachowanie. Kompletnie bez sensu. Ale taki jest standard. Na dodatek większość nowoczesnych kompilatorów zachowuje się mądrzej niż definiuje to standard i program powinien zachować się tak jak intuicja podpowiada. |
|
j23 |
» 2016-05-04 13:00:21 @Kaikso, teoria baardzo naciągana. Kompilator, owszem, może przebudować pętlę, ale nie aż tak, żeby czytać dane wtedy, kiedy nie trzeba. W tym przypadku zaporą jest warunek pętli.
|
|
DejaVu |
» 2016-05-04 15:46:02 |
|
j23 |
» 2016-05-04 18:49:03 @DejaVu, według mnie to szukanie dziury w całym. Prawdopodobieństwo, że u skibixd new zwróci adres 0x0 jest praktycznie równe zero. |
|
« 1 » 2 |