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

co robi ten for?

Ostatnio zmodyfikowano 2016-05-04 22:28
Autor Wiadomość
skibixd
Temat założony przez niniejszego użytkownika
co robi ten for?
» 2016-05-04 08:29:46
Witam,
mam taki programik
C/C++
#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?
P-147912
carlosmay
» 2016-05-04 09:01:35
Iteruje od końca po łańcuchu znaków.
char *
 to wskaźnik.
C/C++
const char * napis = "napis";
std::cout << *( napis + 1 ); // a
std::cout << napis[ 1 ]; // a
}
Zapisy równoważne.
P-147915
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.
P-147916
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.
P-147919
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.

C/C++
#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.
P-147921
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.
P-147922
DejaVu
» 2016-05-04 15:46:02
P-147931
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.
P-147932
« 1 » 2
  Strona 1 z 2 Następna strona