Problem ze zrozumieniem paru znakow c++


(South Park) #1

mam pytanie nie dlatego, że nie umiem pisać, tylko dlatego, że chce zrozumieć jedyne rzeczy, których nie rozumiem,

po pierwsze po co DOKLADNIE uzywa sie '\n'; i może odpuśccie sobie odpowiedzi typu "jak to po co google nie boli, ale tak z łaski swej powiem ci ze chodzi o to ze odpala nowa linie" bo tyle to wiem, chodzi mi tylko o dokladne wyjasnienie i daj boze przyklad

po drugie dlaczego czasem tak: '\n'; a czasem tak: "\n";

a po trzecie chce dokladnie nauczyc sie operatorow logicznych, a utrudnia mi to ta linijka kodu:

cout<<"(a=2)||(3==5) to"<<((a=2)||(3==5))<<'\n'; a dokladniej element (a=2), ta cholerna zmienna przyporzadkowana do dwojki mnie wkurza bo gdzie tu niby rownosc pomiedzy "a" a 2 ? po napisaniu aplikacji wykazuje mi,ze jest rowne(no bo przeciez nie (3==5)

z gory thx


(Kalin 93) #2

Coś tu jest pomieszane ...

A więc tak :

piszesz '\n' jesli chodzi Ci o znak nowej lini w postaci kodu ASCII

a "\n" jeśli używasz tego w cout


(Sawyer47) #3

Co do postu kalin93 to nieważne gdzie używasz. \n to znak nowej linii, znak między '' jest to litera (wbudowany typ char), natomiast jeżeli ujmiesz znak(i) w "" wtedy jest to tablica znaków, tzw. C-string - jest to tablica znaków char ze znakiem NULL na końcu. Jeszcze uwaga do \n - ogółem jest to znak nowej linii ale na różnych systemach jest to różnie. Na GNU/Linux (a więc pewnie i na innych Unix-like), znak nowej linii to \n (czyli masz przejście do nowej linii w edytorze tekstu).

Na Windows i na Mac OS jest inaczej, tam jest to kombinacja \r\n (nie pamiętam w jakiej kolejności dla jakiego systemu).

Co do wyrażeń logicznych - można robić w nich przypisania, ale trzeba to robić ostrożnie. Kompilator powinien ostrzec przed przypisaniem w kontekście logicznym .Aby dać znak kompilatorowi, że naprawdę chce się wstawić przypisanie trzeba objąć je w dodatkowe nawiasy (choć nie jest to regułą, różnie to wygląda w różnych kompilatorach). Natomiast wartość logiczna przypisania to wartość przypisywana, np. var = 0 da false, a var = 1 to true.


(Fiołek) #4

\n - line feed :wink:

Na Windowse: "\r\n"(samo \n w konsoli też działa), Na Makówce to chyba tylko powrót karetki("\r") jest.


(D Kielbania) #5

zna "=" to jest operator przypisania, zaś znak "==" to operator równości.

co do " \n " i ' \n ' to wg mnie sprawa ma się tak, że "" używamy, jeżeli wpisujemy więcej niż jeden znak, zaś ' ' gdy mam tylko jeden. \n to znak nowej linii, czyli teoretycznie JEDEN znak. Ale zapis tego bywa różnie.

zamiast \n możesz użyć <


(Sawyer47) #6

<< std::endl to nic innego jak

<< '\n' << std::flush

O ile komunikuje się z użytkownikiem przez konsole to wtedy flushowanie jak najbardziej jest wskazane, ale poza tym lepiej zostawić zarządzanie buforowaniem samej klasie ostream.

PS. Dla początkujących - std::flush nakazuje opróżnienie bufora, czyli natychmiastowy zapis do pliku czy na ekran.


(system) #7

Widzę w tym temacie dużo odpowiedzi ale jakoś wg mnie żadna w pełni nie odpowiada na postawione pytanie.

co do znaków specjalnych:

\r - ascii 13 - przejście na początek wiersza

\n - ascii 10 - następny wiersz

\b - ascii 8 - poprzedni znak

\t - ascii 9 - tabulacja

\a - ascii 7 - sygnał dzwiękowy

\" - ascii 34 - znak "

\' - ascii 39 - znak '

\\ - ascii 92 - znak \

każdy z tych znaków może być użyty jako znak np:

char c='\t'; int a='\\'; cout<<'\t';

oraz w ciągu znaków np:

cout<<"\"abc\b\""; // na ekranie będzie "ab"

cout<<"Ala ma kota\rEwa"; // na ekranie będzie Ewa ma kota

No i drugie pytanie - logika: W C/C++ każda wartość logiczna może być skonwertowana na liczbę na zasadzie: true -> 1 false -> 0 np:

int a=(2<3)+(3<4)+(4<5)+(5<=6); // zostanie przypisana wartość 4

i w drugą stronę, każda wartość liczbowa może być skonwertowana na wartość logiczną na zasadzie: 0 -> false pozostałe wartości -> true więc wyrażenie:

cout<<((a=2)||(3==5));

do a zostanie wpisana wartość 2

liczba 2 potraktowana jako wartość logiczna to true

true||false -> true

wartość logiczną true traktujemy jako liczbę (będzie to liczba 1) aby wrzucić na stdout

więc na ekranie zobaczymy liczbę 1


(South Park) #8

Yhm, to tak:

jeśli chodzi o dpoisywanie std::endl to ja po prostu przed klamerka(jeszcze przez int main()) uzywam using namespace std;

i tym samym oszczedzam sobie pisania, i dodatkowo optymalizuje kod, dzięki czemu wszystko szybciej dziala, a jesli ktos by chcial edytowac/pracowac na moim kodzie, ma przejrzysta sprawe :slight_smile:

Dalej, co do tego, że jest to zagmatwane spiesze z wyjasnieniami: otoz tak, fragment kodu jaki przedstawilem, jest jedna z kilku(raczej nastu-szczegol)linijek tworzacych prosty program obliczajacy prawde/falsz danego dzialania matematycznego, dodam iz na samym poczatku tzn od razu po pierwszej klamerce dosdalem int a; interesuje mnie tez na co mi dokladnie pozwala to pojecie, jako ze int jest jednym z trzech typow liczbowych (int double float), czy dzieki temu moge operowac na zmiennej "a"?

czy moze cos wiecej? a co do '\n'; to tak: zauwazylem tyle, że ustawiam ja zawsze na koncu polecenia wydanego przez cout (wyswietlanie tekstu na ekran), ale mialem raz czy dwa przypadek, że zamiast pojedynczego cudzyslowa musialem wziac to w podwojny czyli "\n". Zeby nie bladzic po omacku wkleje ta linijke:

cout <

To tez linijka z dzialania matematycznego(jak nie trudno sie domyslic) ma ona wyswietlac kolejno wczesniej obliczone liczby, po kazdej spacje(oprocz ostatniej). Chcialbym wiedziec dlaczego jest tutaj uzyty podwojny cudzyslow, to nie blad, probowalem wstawic pojedynczy, i nie przeszlo, wiec cos w tym jest, chcialbym po prostu rozumiec WSZYSTKO co pisze - przyszlosc przede mna :slight_smile:

no rozpisalem sie, mam nadzieje ze ktos pomoze, aha jakby co to pracuje na windows xp, bo rzeczywiscie wersje kodu roznia sie dosyc znaczaco na windach i linuxie

O fajnie, 13 smok, dziekie za wytlumaczenie, akurat odpisales kiedy pisalem swojego posta,juz rozumiem o co chodzi z tym a, teraz tylko prosilbym o wyjasnienie roznic pomiedzy pojedynczym a podwojnym cudzyslowem znaku specjalnym \n :wink:

a co do wartosci loginczych (true/false - 1/0) tylko chcialem sie upewnic ze chodzi o przypisanie(lub dokladniej podmiane bo a2==2 jest malo prawdziwe)dwojki do zmiennej a. Dzieki. Teraz jeszcze cudzyslowa w \n, no i wyjasnienie, czy int a; sluzy (albo czy tylko sluzy) do operacji na przypsanej zmiennej (tutaj "a")

Z gory thx


(Sawyer47) #9

Różnica między ' a " jest taka jak napisałem. Pierwszy typ cytowania stosuje się do pojedynczych liter - typu char. Natomiast cudzysłowy tworzą tablicę znaków ze znakiem NULL na końcu, tzw. C-stirng. Czyli '\n' to znak nowej linii, typ char. Natomiast "\n" to C-string, typ to const char[2] - dwuelementowa tablica typu char. Kod z '\n' też powinien się kompilować. Oto przykładowy kod, powinien być pomocny przy zrozumieniu problemu:

char newline_char = '\n';

	const char newline_arr[2] = "\n";


	assert( '\n' == newline_char );

	assert( '\n' == newline_arr[0] );

	assert( '\0' == newline_arr[1] );

	assert( NULL == newline_arr[1] ); // g++ ostrzega o użyciu NULL w kontekście arytmetycznym, ale kompiluje

(South Park) #10

No dobra, ale skoro tryb char do pojedynczych znakow oznaczany pojedynczym cudzyslowem, sluzy do oznaczania pojedynczych znakow, to czy dobrze rozumiem ze typ const char[2] sluzy do oznaczania dwoch lub wiekszej ilosci znakow? I dlaczego w tym przypadku oznaczono nim pojedynczy znak("\n":wink: ?

Z gory thx


(Fiołek) #11

(const) char[2] to tablica char'ów. Mogą się zmieścić w niej dwa i tylko dwa znaki. nr47 tłumaczył, że jeśli ujmiesz znak(i) w cudzysłów, to powstaje tzw. C-string, czyli ciąg znaków zakończony znakiem 0(NULL).


(Sawyer47) #12

Pojedynczy znak to coś co znajduje się między apostrofami - jest to typ char. Natomiast jeżeli ujmiesz tekst w cudzysłów, wtedy jest to TABLICA znaków. Nie ważne, czy między cudzysłowami jest jeden znak czy milion, jest to tablica (N+1)elementowa gdzie N to liczba znaków. Plus jeden bo automatycznie dodawany jest znak NULL.

Pisząc const char newline_arr[2] = "\n" chciałem zaznaczyć, że choć ty piszesz jeden znak to drugi jest dodawany automatycznie.

PS. Oczywiście wiesz co to tablice w C++?


(South Park) #13

Jeszcze nie :slight_smile:

dlatego tak o wszystko pytam, siedze nad C++ od 4 dni od rana do nocy, a spie no chyba nie sklamie jak powiem ze3-4 godziny moze troche mniej, a odrywam sie tylko zeby zaparzyc kawe :slight_smile:

umiem juz 1/5 C++ bo szybko sie ucze, ale do tablic jeszcze nie doszedlem, rozumiem wszystko co do tej pory przeczytalem, ale tablice to(niedaleka)przyszlosc daje sobie MAX czasu do polowy lipca na nauke calego C++ (uda sie ze spacja albo i bez),potem biblioteki graficzne DirectX SDK, biblioteki dźwiękowe, no i 3ds max 2009,to wszystko w wakacje, ale biorac pod uwage ze juz nie uzywam kompa do niczego poza nauka i pisaniem na forum, to jest to realny termin. Dlatego nie sadzcie ze jestem jakims ulomem bo zadaje tyle -byc moze dla was idiotycznych pytan,

bo po prostu chce chlonac wiedze i wszystko co moze mi sie przydac :slight_smile:


(Sawyer47) #14

Czy 1/5 ma znaczyć 20%? Oj mylisz się, ja bym napisał raczej 1/500 C++, skoro jeszcze do tablic "nie doszedłeś". Uważam również, że twoje plany są nierealne, programowania uczy się latami. Ale cóż, powodzenia. Radzę tylko najpierw poczytać książki/fora/strony , a dopiero później pytać na forum.


(South Park) #15

No cóż ja bym tego aż tak nie wyolbrzymiał, oczywiście wiem, iż programowanie to trudna, sprawa, chodziło mi o to, że przeszedłem 20% kursu C++ z it hk, zawierającego, podstawy, to fakt, ale czytam i uczę się nie tylko z tego, używam wielu roznych sposobow,a ten kurs jest tylko jednym z nich, co do ksiazek, for itp. juz zaczalem, nie jestem glupi, aby sadzic, ze naucze sie wszystkiego z jednego kursu. On jest tylko jedna z wielu rzeczy jakie musze przejsc, aby stac sie programista, ale i tak uważam swój termin za realny, a zuzywanie lat na nauke jednego jezyka jest wedlug mnie mozliwe tylko wtedy gdy dziennie siedzi sie przy tym naprawde krotko. A co do pytan zadawanych na forum, uwazam ze kazdy i zawsze powinien pytac na forach gdy tylko ma jakis problem- w koncu od tego one sa.

A co do tego 1/500 az tak zle to nie jest :slight_smile:

Aha

Dzieki i nawzajem :slight_smile:


(system) #16

Wydaje mi się, że jeżeli naprawdę chcesz się nauczyć programowania to chyba zastosowałeś złą taktykę. Programowanie to w głównej mierze rozwiązywanie problemów a nie klepanie kodu. Języki programowania to jedynie narzędzia do implementacji algorytmów i struktur danych. Ja bym ci sugerował na początek skupić się trochę bardziej na podejściu algorytmicznym do problemów jakie chcesz rozwiązywać a nie na uczeniu się na pamięć wszystkich bibliotek c++. Poza tym uważam, że na początek lepiej zabrać się za czyste Ansi C a nie pakować się od razu w obiektówkę. W ten sposób łatwiej ogarniesz strukturę kodu i oswoisz się ze składnią języka.

powodzenia!