MTPR Temat założony przez niniejszego użytkownika |
Wczytywanie liczb, kolejka wejściowa, łączność operatorów » 2014-05-15 20:19:11 Witam, kończę kolejny dział w książce z której się uczę i mam odnośnie tego kilka pytań. Sprawa 1int n = 100; cin >> n; cout << n;
Zdania z książkiKiedy zamiast liczby wpiszemy słowo, to: -Wartość n pozostanie bez zmian Więc dlaczego w kodzie powyżej cout wypisuje 0 a nie 100 ? -Nieprawidłowe dane pozostaną w kolejce wejściowej.No dobra. Chcąc pozbyć się tych danych wykorzystam pętle for( char ch; ch = cin.get() != '\n'; cout <<( int ) ch << ", " );
Tutaj nie rozumiem dlaczego podając np. literę, w kolejce wejściowej jest liczba 1. -Jeśli metoda cin zostanie wywołana i przekonwertowana na typ bool, da wynik false Dobrze rozumiem że każde wyrażenie z cin obojętnie gdzie użyte powoduje wywołanie metody cin, która zwraca obiekt cin ? Dodatkowo jeżeli jest to miejsce gdzie oczekiwana jest wartość typu bool np. warunek pętli wywoływana jest dodatkowa funkcja klasy istream pozwalająca przekształcić zwracany obiekt cin na wartość typu bool ? Sprawa 2Czy kolejka wejściowa to, to samo co bufor obiektu cin ? Kiedy odczytana zostanie pierwsza dana do kolejki wejściowej wczytywana jest cyfra 8 i ona będzie interpretowana w następnej operacji odczytuchar word[ 50 ]; cin >> word;
cin wczyta dane do pierwszego białego znaku, czyli wczyta cyfrę 3, 8, kropkę i cyfrę 5. W kolejce wejściowej zostanie do odczytu tylko spacja.Do tej pory myślałem że po zatwierdzeniu danych wejściowych Enterem trafiają one do programu czyli kolejki wejściowej ? Ale z tego wynika że po zatwierdzeniu 38.5 19.2 Enterem, cyfra 3 zostanie przypisana do zmiennej ch a dopiero wtedy do kolejki wejściowej wczytywana jest cyfra 8. Więc się pogubiłem jak to w końcu jest :c Sprawa 3Łączność lewostronną, prawostronną operatorów w książce mam oznaczone jako L, P. Jednak operator =, operatory złożonego przypisania += i :? mają łączność oznaczoną literą R, czyli jaka jest to łączność ? |
|
Monika90 |
» 2014-05-15 20:48:30 Więc dlaczego w kodzie powyżej cout wypisuje 0 a nie 100 ? |
Bo język się zmienił. W C++11 zmienna jest zerowana jak się wczytywanie nie uda, w C++98 była pozostawiana bez zmian. ieprawidłowe dane pozostaną w kolejce wejściowej. No dobra. Chcąc pozbyć się tych danych wykorzystam pętle |
Ponieważ strumień przeszedł w stan fail, więc cin.get() zwraca EOF, jak wywołasz cin.clear(), to będziesz mógł wczytać literę, która jest w kolejce wejściowej. Łączność lewostronną, prawostronną operatorów w książce mam oznaczone jako L, P. Jednak operator =, operatory złożonego przypisania += i :? mają łączność oznaczoną literą R, czyli jaka jest to łączność ? |
tłumacz zapomniał przetłumaczyć literę R na P, (w j. angielskim right-associative) Na resztę pytań z pewnością odpowie Ci ktoś inny. |
|
MTPR Temat założony przez niniejszego użytkownika |
» 2014-05-15 21:56:59 Wiem, przed tą pętlą wywoływałem cin.clear() inaczej pętla byłaby nieskończona. Nie chodzi mi tu o warunek pętli tylko dlaczego wyrażenie cout <<( int ) ch << ", " pokazuje liczbę 1. Przy okazji zauważyłem że stała symboliczna EOF jest u mnie zdefiniowana w pliku nagłówkowym <fstream> natomiast w książce pisze że jest zdefiniowana w <iostream>, wiesz może czemu tak jest ?
|
|
pekfos |
» 2014-05-15 22:03:54 Przy okazji zauważyłem że stała symboliczna EOF jest u mnie zdefiniowana w pliku nagłówkowym <fstream> |
Na jakiej podstawie tak uważasz? |
|
Monika90 |
» 2014-05-15 22:05:13 ch = cin.get() != '\n' != ma wyższy priorytet niż = , wiec do ch jest przypisywany wynik porównania: true lub false, konwertowane na 1 lub 0. |
|
MTPR Temat założony przez niniejszego użytkownika |
» 2014-05-15 22:06:30 Bez pliku nagłówkowego <fstream> C:\Users\E531\Desktop\Poligon C++.cpp||In function 'int main()':| C:\Users\E531\Desktop\Poligon C++.cpp|9|error: 'EOF' was not declared in this scope| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
kiedy go dołączę program się kompiluje. |
|
pekfos |
» 2014-05-15 22:07:22 Bo zapewne dołącza <cstdio>, tam jest zdefiniowane te makro. |
|
MTPR Temat założony przez niniejszego użytkownika |
» 2014-05-15 22:13:33 Monika90 Faktycznie, wyjaśnione. pekfos Rzeczywiście po dołączeniu <cstdio> zamiast <fstream> program też się kompiluje. Jednak podałeś mi jeszcze inny plik nagłówkowy niż pisze w książce, to jak w końcu. |
|
« 1 » 2 |