[c++] Problem z inkrementacją (++x oraz x++)


(Withorlo2) #1

Witam, od razu przejdę do rzeczy. Napisałem poniższy program:

#include 

#include 

#include 

#include 


using namespace std;


int main()

{

    int x = 0, y = 0;

    string podajNazwisko;

    vector nazwiska;


    for(x;x<3;x++){

        cout << "Podaj nazwisko " << x << ": ";

        cin >> podajNazwisko;

        nazwiska.push_back(podajNazwisko);

        sort(nazwiska.begin(), nazwiska.end());

    }


    cout << endl;


    for(y;y<3;y++){

        cout << "NAZWISKO " << y << ": " << nazwiska[y] << endl;

    }

    return 0;

}

Po zbudowaniu i uruchomieniu wszystko działa OK ale chciałem aby cyferka przy “Podaj nazwisko ‘n’:” oraz “NAZWISKO ‘n’” zaczynała się od jedynki, czyli zmieniłem w zmiennych x,y wartość na 1 oraz w obu pętlach ustawiłem x<4 tak żeby program prosił o podanie identycznej liczby nazwisk jak to miało miejsce wcześniej. Pierwsza pętla działa w porządku prosi o podanie 3 nazwisk ale druga zaczyna sczytywanie z wektora dopiero od wartości o jeden większej. Nie mam pojęcia dlaczego tak się dzieje skoro w pierwszym przykładzie (ten którego kod podałem) wszystko działa dobrze. P.S. Wiem że mogłem napisać

cout << "NAZWISKO " << y + 1;

ale chce dojść do tego co robię źle, testowałem już pisanie zamiast x++ pisać ++x ale efekty były takie same.


(Drobok) #2

Przecież tablice mają indeksy liczone od 0. Więc albo robisz x+1 w nr, albo x-1 w indeksie tablicy :slight_smile:


(etam) #3

Dokładnie to należy zrobić. Jaka jest różnica między “y+1”, “y++”, a “++y”:

int y = 0;

int x = y+1;

std::cout << x << ' ' << y << std::endl; // wypisze 1 0

int y = 0;

int x = y++; // najpierw przypisanie, potem inkrementacja [*]

std::cout << x << ' ' << y << std::endl; // wypisze 0 1

int y = 0;

int x = ++y; // najpierw inkrementacja, potem przypisanie [*]

std::cout << x << ' ' << y << std::endl; // wypisze 1 1

[*] - To co się tam tak na prawdę dzieje wymagało by troszkę dłuższego wywodu, ale objawy są takie jak napisałem. Kilka uwag: int x=0; […] for(x;x<3;x++) 1) Jeżeli zmienna x jest używana tylko wewnątrz pętli, to nie ma sensu deklarować jej poza pętlą. To nie jest C - tutaj możesz zmienne deklarować w każdym miejscu i najlepiej to robić tuż przed pierwszym użyciem, a nie tuż za “{” 2) Zaznaczony na czerwono “x” nie jest błędem, ale też nic nie wnosi. Generalnie powinieneś pisać “for(int x=0; x<3; x++)”. Jeżeli jednak zmienna x byłaby ci potrzebna przed wejściem lub po wyjściu z pętli, to rób tak:

int x=0;

for(; x<3; x++)

Jeżeli chcesz mieć wektor “nazwiska” posortowany, to lepiej to robić po dodaniu wszystkich nazwisk.