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

Od Petr Zemek, 2009-02-13

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;
Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
3 + 5 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.

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;
}

Petr Zemek

15 years zpět

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