Tak jsem po kratší odmlce zpět a přináším další zajímavou úlohu z jazyka C++. Dnes se moc programovat nebude, ale o to víc bude třeba přemýšlet :). Ještě bych chtěl poznamenat, že úlohy budu přinášet nepravidelně podle toho, jak mě vyjde čas a zda mě něco zajímavého napadne nebo na něco narazím.
Zadání
Kolik nejvýše po sobě jdoucích znaků (tj. bez mezer apod.) následujících symbolů se může vyskytnout ve validním (a přenositelném) C++ zdrojovém kódu podle normy C++98 (mimo komentáře, řetězce, nepoužitá makra apod.)?
a) !
b) +
c) &
d)
e) ?
U každého symbolu napište počet a zdůvodnění/příklad (stačí ukázka kódu s výskytem těchto znaků a idea/nutné podmínky - není třeba definovat všechny použité proměnné apod.).
Řešení
Když někdo přijde na správné řešení, tak ho zde zveřejním (moje nebo originální od autora), ať to máme pokupě.
a) !
Neomezeně mnoho (Afri) - viz následující příklad.
if (!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!condition) { // ... }
b) +
Neomezeně mnoho (Afri) - stačí vhodně přetížit postfixový operátor ++ (to nám umožní napsat sudý počet symbolů +) a binární + (pro lichý počet symbolů plus) u nějaké třídy, potom lze napsat:
A a,b; a+++++++++++++++++++++++++++++++++b;
c) &
5 - např. takto:
&A::operator&&&&&a;
což se parsuje jako
&A::operator&& && &b;
takže se provádí logický and mezi ukazatelem na metodu a jiným ukazatelem (je třeba definovat A::operator&&).
d)
4 - např. takto:
&A::operator<<<<b;
což se parsuje jako
&A::operator<< << a;
a provádí se bitový posun mezi ukazatelem na metodu a jinou proměnnou (je třeba definovat A::operator a přetížit globální operátor ).
e) ?
3 - zkombinováním ternárního operátoru a trigraphu ??/, který slouží ke spojení řádků
a ???/ b : c;
odpoved
No vcelku libovolne mnoztvi, ne? Napr.
Projde to pres
tak tipuju, ze to je jak validni, tak i prenositelne a nejde o komentare, ni retezce.
Re: odpoved
Hehe, ja vedel, ze neco zapomenu zakazat - tohle by me nenapadlo :). Jo, podle puvodniho zadani by to melo byt spravne... Kazdopadne, muzes ted zkusit vyresit "opravene" zadani :).
2/5
Necht neomezene = implementacni nebo normou dany limit operatoru v jednom vyrazu: mam zato, ze normou dany neexistuje, ale divat se mi nechtelo.
a) neomezene:
b) neomezene, sude cislo, pomoci zhovadileho pretizeni postfix ++:
e) tady tipuju, 2 jako trigraph sekvence?
u c) a d) me nenapada nic, krome prislusnych dvouznakovych operatoru, ale chapu, ze to asi nebude spravne: <<, &&
Re: 2/5
Diky za odpoved.
ad a) Spravne.
ad b) Zkus popremyslet, zda by neslo pouzit i lichy pocet symbolu +.
ad e) Tady jich lze pouzit vic nez 2 za sebou, ale jsi na spravne ceste.
ad c,d) Tady jich lze opet pouzit vic nez 2 za sebou :).
ad b)
ad b) no samozrejme ze slo, ale vic nez neomezene uz to nebude ;) kdyz spravne pretizim jeste operator+, muzu vyvadet toto
re: ad b)
Jo, presne tohle jsem chtel videt :). Jinak neomezene mnoho je samozrejme spravna odpoved.
Zveřejněno kompletní řešení #5
Zveřejnil jsem kompletní řešení páté úlohy (pouze ty otázky, u kterých jsem vymyslel řešení s větším počtem daných symbolů, než zde v komentářích padlo).
re: Zveřejněno kompletní řešení #5
Pekne... nad tim ternarnim operatorem jsem nekolikrat premyslel, ale tohle mi uslo :)