[OT]C CO tim chtel basnik rici?
David Obdrzalek
David.Obdrzalek na mff.cuni.cz
Čtvrtek Leden 1 20:40:33 CET 2015
No, ja to vidim obracene - pro toho, kdo C/C++ ovlada o neco vic nez jen ze tak nak
umi zakladni syntaxi, tak je zapis if (str && *str) na prvni pohled zrejmy(*),
zatimco s tim delsim bude premyslet, proc to autor napsal takhle, mozna ze to psal
nekdo, kdo si v C neni jisty anebo v horsim pripade dela neco zhuverileho kvuli
vedlejsim efektum. A v tomhle prikladu: obzvlaste konstrukce typu if(cokoli!=0)
pokladam za prinejmensim ponekud neobratne (nemluve o if(str[0]!='\0'), to je asi
jako kdybych psal if A=TRUE then begin B:=TRUE; end else begin B:=FALSE; end;). I
kdyz to prekladac nejspis prelozi uplne stejne jako kdyz se to !=0 vynecha, myslim,
ze by se to tak psat nemelo.
Nicmene celkove, pri vsi ucte, domnivam se, ze neni k nicemu se hadat (nebo
presvedcovat) jestli Pascal nebo C nebo dokonce jestli ne Pascal nebo ne C.
Skodovkar s trabantistou se navzajem presvedcujou, ze jejich zihadlo je lepsi,
protoze jedno umi brzdit motorem a ve druhem se nemusi menit olej ;-)
Ja osobne jsem zacinal na BASICu od Acornu, pak asembler 6502, LISP, Pascal, Prolog,
C, C++, assembler 8086, JavaScript, PHP, Postscript, assembler pro PIC a AVR a asi
jeste neco. Samozrejme uz davno neovladam vsechno tak jako kdyz jsme se tim zrovna
zabyval (a samozrejme ani tehdy jsem nebyl nejlepsi). Nakonec moc dobre vim, ze
kazdy jazyk ma svoje, a ze v kazdem se da neco udelat elegantne i prasacky a v
podstate jsou neporovnatelne. Na neco se hodi lepe ten, na jine jiny, pro mnohe
ulohy je jedno v cem se to napise. Nektere se mi libi vic, jine min (neprisel jsem
treba na chut Pythonu kde zalezi na zarovnani textu, ale jsem tolerantni a nerikam o
nem ze je spatny protoze neni prehledny). Tak ci tak, kdyz uz neco pisu v libovolnem
konkretnim jazyce, tak bych mel vedet, co a proc pisu a psat to tak, aby to tomu
jazyku odpovidalo. Nebo se aspon snazil.
Neco trochu jineho je, kdyz se snazim pochopit novy jazyk - samozrejme neznam
vsechny nuance, delam chyby a nesikovnosti a ptam se na veci, ktere expertum treba
prijdou jako triviality.
David
(*) Kdyz vidim if(str && *str) tak to je na prvni pohled jasne, protoze vim, ze:
1. podminky s && se vyhodnocuji zleva dokud neni jasny vysledek
2. kdyz je str pointr (na cokoli) tak if(str&&....) testuje, jestli nekam rozumne
ukazuje a kdyz jo, pokracuje ve vyhodnocovani dalsi podminky, coz je typicky neco co
ten pointr pouziva. Kdyz ne, tak dalsi testovani nema smysl protoze s tim pointrem
nechci nic dalsiho delat.
3. kdyz se vyhodnocuje *str, tak uz vim, ze ten pointr na neco ukazuje protoze jinak
by se to zastavilo uz pred tim
4. if(....&& *str) testuje na nenulovost toho, na co str ukazuje, coz muze byt prvni
prvek pole nejakeho pole anebo jedna hodnota, ale to je uplne jedno, ptam se na to
prvni co tam je a dalsi me nezajimaji.
Samozrejme ze by pointr mohl nebyt nulovy a pritom vest do kopru, ze typ toho na co
ukazuje nemusi byt logicky spravne preveditelny na int aby se dala otestovat jeho
nulovost atd. atd. ale to uz jsou dalsi dohady ktere neznalce zmatou protoze v
beznych pripadech jsou irelevantni (tady to ukazuje na char tak cast na int neni
treba rozebirat), pouceny uzivatel se tem nebeznym pouzitim vyhne a znalec vi jak to
pouzit i v tech nebeznych pripadech (ale treba to taky nedela, protoze chce aby jeho
kod byl citelny i neznalcum, anebo to treba dela, protoze plne vyuziva prostredky
sveho jazyka). A stouralove to vyuzijou k tvrzeni, ze tento jazyk neni dobry.
On 31 Dec 2014 at 11:48, Marek Sembol wrote:
> Ano. Rozdil je celkem zasadni - na tom prvnim zapise je na prvni pohled
> zrejme o co se programator snazil :)
> ale funkcne to bude stejne.
> Marek
>
> 2014-12-31 11:45 GMT+01:00 Miroslav Mraz <mraz na seznam.cz>:
>
> > A je nějaký rozdíl mezi
> > if (str != NULL && str[0] != 0) a
> > if (str && *str) - je to alespoň kratší. Když už je ten Silvestr.
> >
> > Mrazík
> >
> > On 12/31/2014 10:49 AM, Jaroslav Buchta wrote:
> > > Diky, tusil jsem, ze jsem to nekde videl takto definovane. Tak to
> > > zacnu taky pouzivat ;-)
> > > char *str;
> > >>> ...
> > >>> if (str != NULL && str[0] != 0)
> > >>> ...
Další informace o konferenci Hw-list