[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