Deprecated: Function set_magic_quotes_runtime() is deprecated in /DISK2/WWW/lokiware.info/mff/wakka.php on line 35
Programování v C++
Přednášející: RNDr. David Bednárek
Zkouška a zápočtový test
Přednášky
Odkaz pro C++ mazáky
Co se bude dělat na které přednášce, abyste věděli, kdy má smysl chodit, a kdy si radši zajděte do kina: http://ulita.ms.mff.cuni.cz/mff/sylaby/prg029.html
1. přednáška 21. 2. 2007 — úvod
- Zapsat se v grupíčku na nějaká cvičení do 4. března (pokud ještě nejsem zapsaný. V případě pře-zapsání kontaktovat aspoň nového cvičícího (protože sám se odhlásit z grupíčku prý nemůžu).
- Zápočtový test je ve zkouškovém období. Obvykle to na první pokus dají tak dvě třetiny. Může se psát i v čistém C. Ale je třeba znalost IDE Visual C++ :(. Zkouška je oproti tomu jednoduchá (aspoň v tomhle semestru). Na zápoťák jsou dva pokusy a třetí dostanu, když mám zkoušku a splněné domácí úkoly. Ke zkoušce jdu nezávisle na zápočtu. Bez zápočtu ale zkouška propadá. Zkoušející jsou ale tak hodní, že jedničky a dvojky příští rok uznají.
- Nové učební plány už tyhle předměty nebudou obsahovat, ale my ho kdyžtak ještě můžeme splnit (ale přednášky nebudou). Když ale začneme studovat od prváku, budeme mít jiné předměty (místo Pascalu C# apod).
- Závěr: Zkoušku i zápočet se vyplatí udělat.
- V místnosti 209 můžeme dostat CD s nějakou ořezanou verzi VC++. Tady je nějaký info http://edgar.ms.mff.cuni.cz/SISAL/MSDNAA.aspx.
- Co se budeme učit a literatura
- The C Programming Language od K&R nám nedoporučuje, protože je to prý zastaralé (Na můj dotaz Bednárek tvrdil, že i druhé vydání je zastaralé. Možná neví, že druhé vydání popisuje ANSI C, tedy přesně to, co říkal, že nás bude učit, ale raději jsem ho nepřesvědčoval.)
- Dnešní C++ zase neodpovídá tomu co psal Stroustrup.
- C++ se v prvním semestru téměř neprobírá. Nebudeme se učit ani C99. Protože se prý používá jen pro programování praček. (Takže budeme dělat převážně ANSI/ISO C 89 (resp. 90).)
- Doporučuje z českých knížek Viriuse, jinak třeba Eckela.
- pro pokročilejší:
- Alexandrescu-Sutter: C++ Coding Standards (2005)
- knížky o programming patterns
2. přednáška 28. 2. 2007 — do slajdu 31
3. přednáška 8. 3. 2007 — do slajdu 40
- Bednárek říkal, že vynechání jména parametru v definici funkce je způsob, jak překladači sdělit, že daný parametr nepoužíváme. Přišlo mi to nějaké podezřelé, a právem, ono to v C nejde. Pokud používáte varování u nepoužitých parametrů, ale někdy chcete parametr ignorovat záměrně (třeba v nějakém callbacku), v C se to řeší nejelegantněji pomocí přetypování na void (a v C++ to jde samozřejmě také):
-
/* int doSomethingWithAB(int a, int b, Info*){ ... } se v C nepřeloží */
int doSomethingWithAB(int a, int b, Info* extraInfo){
(void) extraInfo;
return a^b;
}
- V tabulce operátorů je chybně priorita ternárního operátoru. Správně má být zprava doleva, což zaručuje, že následující dva úseky kódu jsou ekvivalentní:
-
x = (c1) ? v1 : (c2) ? v2 : w; /* c1 ? v1 : (c2 ? v2 : w), nikoli (c1 ? v1 : c2) ? v2 : w */
-
if(c1) x = v1;
else if(c2) x = v2;
else x = w;
- BTW, v PHP je to z nějakého důvodu zleva doprava, i když jinak je prirorita obdobně jako v C/C++, kdybyste na to někdy narazili.
- Napsat si tam ty závorky ale vůbec neuškodí, priorita nepriorita. (/Tomáš Kraut)
- Máš pravdu, ale v tomhle případě má pravá asociativita význam. Tohle se prostě nezávorkuje. Podívej:
-
/* závorky jen kolem podmínek usnadňují čtení, o zbytek se postará pravá asociativita */
x = (c1) ? v1 :
(c2) ? v2 :
(c3) ? v3 :
w;
/* tohle je k ničemu a závorky tu podle mně škodí;): */
x = (c1 ? v1 : (c2 ? v2 : (c3 ? v3 : v4)));
— Adam
4. přednáška 14. 3. 2007 — do slajdu 48
- Pokud nám stejně dobře posloužíí var++ jako ++var, měli bychom používat preinkrementaci, protože v jazyce ++C se to za určitých okolností proběhne rychleji. V C je to jedno. Bohužel vysvětlení jsem nepochopil, nedával jsem zrovna moc pozor:(.
- Vysvetleni. ++var vrati inkrementovanou hodnotu, var++ hodnotu inkrementuje, ale vrátí původní hodnotu, takže musí udělat aspoň jednu kopii dat proměnné. V C je ++prefix i postfix++ ale vestaveny operator, takze i ve slabsich kompilatorech to vytvareni kopie odrizne proces optimalizace. V C++ je problem ze operatory uz nejsou built-in, ale vicemene normalni pretizene funkce, ktere musi mit nekde kod platny pro vsechny pripady – takze optimalizace by nemela byt mozna. Nastesti drazsi kompilatory (gcc tak od verze 3) uz umi optimalizovat brutalnejc, takze se vytvareni kopie taky nekdy muze uriznout, a to jak pro postinkrementaci vestavenych typu, tak pro pretizene ++ v nejake tride – staci ho dobre napsat (napriklad jako inline). Doufam ze to nekdo pobral. — exa
- Ukazatel NULL. Přednáška byla v tomto bodě poněkud zmatená. Některými věcmi jsem si nebyl jistý, tak jsem si dohledal, že:
- V C je standardem garantováno, že hodnota NULL je 0. Nemůže se stát, že NULL by ve skutečnosti znamenalo na nějaké architektuře 42. V C se téhle skutečnosti využívá běžně, ač nepřímo, např. v konstrukci if(!ptr) místo if(ptr==NULL). Není to žádná výsada C++.
- V C++ je standardem garantováno, že NULL je prostě totéž co celé číslo 0 (zatímco v C to bývá 0 přetypovaná na void*).
- Z toho plyne, že jekékoli používání 0 místo NULL (a naopak) v C++ je dané jen osobním vkusem, případně nějakými metafyzickými důvody.
- Z toho také plyne, že v C++ (a nakonec i v C) se bez konstanty NULL obejdete a můžete místo ní kdekoli používat celé číslo 0.
- Bednárek třeba říkal, že v nějakém případě (při inicializaci myslím) je C++ nutné použít konstantu NULL místo obyčejné 0. To není pravda, v C i C++ mohu použít 0.
- Jsou pripady kdy typova kontrola NULL povoli a nulu ne, ale takove chovani je proti ANSI a myslim ze uz vymizelo.
- Pro ty, kteří nemají s C(++) zkušenosti a ptají se teď, na co teda NULL je: Aby bylo na první pohled zřejmé, zda se jedná o ukazatel nebo číslo. Z téhož důvodu se často píše 0.0 nebo 0. tam, kde má být float, i když překladač by vzal i prostou celočíselnou 0.
Odkazy