Jste zde

Zajímavé úlohy pro programátory v C a C++ #5

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;

Komentáře

No vcelku libovolne mnoztvi, ne? Napr.

#define neco1 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define neco2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define neco3 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#define neco4 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#define neco5 ???????????????????????????????????????????????????????????????
int main() { return 0; }

Projde to pres

g++ -std=c++98 -pedantic -pedantic-errors -Wall -W

tak tipuju, ze to je jak validni, tak i prenositelne a nejde o komentare, ni retezce.

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 :).

Necht neomezene = implementacni nebo normou dany limit operatoru v jednom vyrazu: mam zato, ze normou dany neexistuje, ale divat se mi nechtelo.

a) neomezene:

if (!!!!!!!!!!!!!!!!!!!! false)

b) neomezene, sude cislo, pomoci zhovadileho pretizeni postfix ++:

CL CL::operator++(int){
  return *this;
}
...
CL a;
a++++++++++;

e) tady tipuju, 2 jako trigraph sekvence?

char array??(5??);

u c) a d) me nenapada nic, krome prislusnych dvouznakovych operatoru, ale chapu, ze to asi nebude spravne: <<, &&

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) no samozrejme ze slo, ale vic nez neomezene uz to nebude ;) kdyz spravne pretizim jeste operator+, muzu vyvadet toto

CL CL::operator+(const CL &other);
...
CL a,b;
a+++++b;
}

Jo, presne tohle jsem chtel videt :). Jinak neomezene mnoho je samozrejme spravna odpoved.

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).

Pekne... nad tim ternarnim operatorem jsem nekolikrat premyslel, ale tohle mi uslo :)

Přidat komentář