den93 |
» 2013-11-05 19:04:15 Książki też piszą ludzie, zresztą to co kiedyś było prawdą dzisiaj nie musi, a i komputery mamy szybsze niż kiedyś. Dlatego też, dziwi mnie ślepa wiara niektórych zwolenników w wyższość pre-inkrementacji nad post-inkrementacjią. Jak widać ploty lubią się roznosić nawet w społecznościach programistów. Ja jednak wolę zostać przy i++ :D. Czy robię źle? |
|
pekfos |
» 2013-11-05 19:07:09 Oba zapisy są poprawne, więc na pewno nie 'żle' ;) Jednak przy złożonych typach danych, dla których operator postinkrementacji jest tak zaimplementowany, że faktycznie wykonuje kopiowanie, bardziej opłaca się używać preinkrementacji. |
|
Atexor Temat założony przez niniejszego użytkownika |
» 2013-11-05 20:25:55 den93 - działa po poprawce :)
2. Do twojego przykładu z for: czytałem o tym że można pomijać wartość inicjującą (np. for(;;;) dla pętli nieskończonych, gdzie np. break kończy), ale jeżeli zdefiniuję wcześniej liczbę, np. i==5 to jeżeli w następnej linijce mam pętlę bez wyrażenia pierwszego to pobiera z tego co jest linijkę wyżej jeżeli zostało określone? Myślałem, że wtedy leci ogólnie od 0.
3. Myślałem, że jak mam while (d--), gdzie d=5 robi do momentu kiedy d zostanie zdekrementowane do 0 i wtedy kończy program, nie potrafię zrozumieć dlaczego ma być niby -1.
A w twoim programie dlaczego za pętlą masz jeszcze raz d--?
Buby: A) 1. 2. 3. To wiem :)
B) Tu chyba widzę odpowiedź na to, co zacząłem odpisywać koledze den93 wyżej. "Wykonuje on te same czynności co kod z punktu B." Gdzie ten drugi zapis? Czyli w tym wypadku zdefiniowanie poza pętlą to jest to samo co w pętli bo pobierze "iloscWykonan=0"? Dlatego bo jest wiersz wyżej, czy pozostałe wartości (kończąca i po każdym obiegu) ma w sobie "iloscWykonan"? Mam nadzieję, że rozumiesz. Czyli taki zapis B.1 to jest to samo, gdybym
C) Próbowałem włączyć ten program. Miałem trochę problemów, bo nie znam std:cout (chyba jak printf) i nie chciał mi z tym działać program w C/C++ zamieniłem na printf i miałem taki oto dziwny wynik: http://i.imgur.com/aBQNHH6.jpg Czyli ostatnia pętla się wykonała... Przy okazji nie wiem czemu w tym programie system("PAUSE"); nie chciał działać, ale to już inna bajka.
2. + 2.E) Do nauki C zacząłem przeglądać "Od zera do gier kodera" (trochę dziwny... w ogóle dziwnie że uczę się c, zamiast c++), ale ogólnie to bazuję właśnie na wikibooks+google+koledzy :)
D) Już rozumiem. A w przypadku jeżeli w deklaracji zmiennych, np. float a,b,c; nie podam ile wynoszą to standardowo... nie wynoszą nic, czy 0 dopóki ich nie użyję do jakiegoś celu?
Pozdrawiam :)
P.S. Forum jest autorskie jeśli dobrze widzę, bo nie przypomina mi znanego typu (IPB, phpBB)? Szacunek dla autora! |
|
den93 |
» 2013-11-05 21:24:41 Może trochę teorii: int i; // to jest definicja (powołanie obiektu do życia) int i = 0; // to jest inicjalizacja (definicja + nadanie wartości początkowej) i == 1; // to jest warunek zwraca wartość typu bool: { true | false } i = 2 // to jest przypisanie, zmiana wartości zmiennej, która wcześniej została zdefiniowana i = i == 1 // np. i = 2 == 1; i = false; Pętla for: for(;; );
for(; true; );
int i = 0; for( i = 0; i < 5; i++ ) ;
Musi być. Właśnie to jest cała różnica pomiędzy tymi dwiema pętlami. Czemu tak się dzieje? Bo dekrementacja wykonuje się niezależnie od stanu warunku. Zanim pętla rozpocznie kolejne kółko to robi dwie rzeczy: sprawdza warunek i zmniejsza d o 1, nawet jeśli warunek nie jest spełniony. W takim wypadku pętla się przerywa ale d i tak się zmniejsza. Z kolei w takiej pętli tak się nie dzieje: jeżeli zdefiniuję wcześniej liczbę, np. i==5 to jeżeli w następnej linijce mam pętlę bez wyrażenia pierwszego to pobiera z tego co jest linijkę wyżej? |
Pobiera: int d = 5; for(; d < 10; d++ );
Nie pobiera: int d = 5; for( d = 0; d < 10; d++ );
printf( "%d\n", d );
|
|
Buby |
» 2013-11-05 21:49:08 std::cout masz prawo nie znać, bo należy do c++. Działa podobnie do printf. Wystarczy utworzyć projekt c++ i na początku dodać #include <iostream> . U mnie wynik tego programu jest inny - wypisuje tylko 2 pierwsze pętle, pozostałe nie. Jutro wrzucę ss'a dla potwierdzenia :) |
|
Atexor Temat założony przez niniejszego użytkownika |
» 2013-11-05 22:46:16 A, to już wiem co i jak z definiowaniem zmiennych ;) Słyszałem, że podobno można definiować je poprzez użycie # (jak biblioteki standardowe) ale chyba jest to niezalecane, mam rację?
A do tego d--: Czyli w takim przypadku (z poprzedniej strony): http://i.imgur.com/bEn1pQN.jpg drugie d-- (przy drugiej czerwonej strzałce) jest po to, aby gdy pętla przerwała "o 1 wcześniej" to za nią jeszcze zmniejszyć wartość d o 1?
Na ostatniej wejściówce właśnie miałem program z licznymi pętlami w pętlach i podanie końcowych wartości a,b,c,d,e,f i przez te zinedekrementowane (? - łamacz językowy) podałem 3 wartości źle (w tym d). Zaś ostatnie to było podpucha bo "wynik zależy od kompilatora w jakim go używamy" jak się okazało. Niestety nie pamiętam jak to dokładnie leciało. Spotkaliście się kiedyś z takim przypadkiem? To jest ta sama zasada dlaczego Bubemu wyświetlają się tylko 2 pętle? Całe życie myślałem, że kompilator to kompilator - robi to samo, tylko jedne wychwtyują błędy/miastake programisty lepiej, a inne wcale...
Buby - i wszystko jasne ;) Gdybym nie dał na printf to myślę, że długo kombinowałbym. Swoją drogą jest jeszcze jakiś sposób na wyświetlenie czegoś w konsoli prcz printf/puts?
|
|
den93 |
» 2013-11-05 23:16:37 podobno można definiować je poprzez użycie # (jak biblioteki standardowe) |
To jest coś zupełnie innego. Za pomocą #define definiuje się makra. za nią jeszcze zmniejszyć wartość d o 1 |
Tak. Musiałem tak zrobić żeby Ci zobrazować jak ta while( d-- ); pętla działa. To był tak jakby dłuższy sposób na to samo. Całe życie myślałem, że kompilator to kompilator - robi to samo |
Są różne kompilatory (gcc, cl[VS], c++builder, ...), różne wersje kompilatorów (starsze, nowsze), i sam język się zmienia. Na ile można na tyle kompatybilność jest zachowywana. Może niech się ktoś wypowie, kto faktycznie wie coś o tym, bo ja niewiele. jeszcze jakiś sposób na wyświetlenie czegoś w konsoli prcz printf/puts |
Zależy o co konkretnie Ci chodzi, ale jest, tylko że ci to do niczego nie potrzebne bo printf to taki kombajn, który jest do wszystkiego, wyczerpuje nasze potrzeby niemal w każdej sytuacji. |
|
Buby |
» 2013-11-06 07:11:44 Atexor, czytać "Od zera dla gier kodera" osobiście bym Ci nie polecił. Dlaczego? Hmm...Pobrałem ostatnio tą książkę w PDF i po otworzeniu, od razu mnie coś odrzuciło. W każdym jednym przykładzie funkcja główna main() jest deklarowana jako void . Co z tym nie tak, ano void to funkcja, która nie zwraca żadnej wartości, a main powinna zwrócić, czy program zakończył się poprawnie. Poza tym słyszałem też kilka złych opinii na temat tej książki. Poza tym język C i C++ jest bardzo zbliżony, a C++ jest wygodniejsze dla użytkownika w wielu fragmentach. Serdecznie polecam Ci kurs na tej stronie, bo nawet taki młot jak ja go zrozumiał. http://cpp0x.pl/kursy/Kurs-C++/1 |
|
1 « 2 » 3 |