abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 13:44 | Komunita

    Bylo spuštěno hlasování o přednáškách a workshopech pro letošní Installfest, jenž proběhne o víkendu 28. a 29. března v Praze na Karlově náměstí 13.

    Ladislav Hagara | Komentářů: 2
    dnes 04:33 | Nová verze

    Byla vydána (Mastodon, 𝕏) třetí RC verze GIMPu 3.2. Přehled novinek v oznámení o vydání. Podrobně v souboru NEWS na GitLabu.

    Ladislav Hagara | Komentářů: 0
    včera 21:44 | IT novinky

    Apple představil iPhone 17e a iPad Air s čipem M4.

    Ladislav Hagara | Komentářů: 12
    včera 21:11 | Zajímavý software

    Byla vydána verze 1.0 editoru kódů Gram. Jedná se o fork editoru Zed bez telemetrie a umělé inteligence.

    Ladislav Hagara | Komentářů: 0
    včera 20:33 | IT novinky

    Byla oznámena spolupráce GrapheneOS s Motorolou. Podrobnosti v tiskové zprávě. GrapheneOS (Wikpedie) je varianta Androidu zaměřující se na bezpečnost a soukromí.

    Ladislav Hagara | Komentářů: 1
    včera 02:22 | Nová verze

    Armbian, tj. linuxová distribuce založená na Debianu a Ubuntu optimalizovaná pro jednodeskové počítače na platformě ARM a RISC-V, ke stažení ale také pro Intel a AMD, byl vydán ve verzi 26.2.1. Přehled novinek v Changelogu.

    Ladislav Hagara | Komentářů: 0
    včera 02:11 | Komunita

    Volí se dvě místa v Radě openSUSE. Seznamte se se čtyřmi kandidáty. Členové projektu openSUSE mohou hlasovat od 1. do 8. března. Výsledky budou oznámeny 9. března.

    lkocman | Komentářů: 4
    1.3. 19:22 | IT novinky

    Společnost OpenAI uzavřela dohodu s americkým ministerstvem obrany o poskytování technologií umělé inteligence (AI) pro utajované sítě americké armády. Firma to oznámila několik hodin poté, co prezident Donald Trump nařídil vládě, aby přestala využívat služby společnosti Anthropic.

    Ladislav Hagara | Komentářů: 14
    1.3. 13:33 | IT novinky

    Technologická společnost Anthropic v noci na dnešek oznámila, že se obrátí na soud kvůli rozhodnutí ministerstva obrany označit ji za bezpečnostní riziko dodavatelského řetězce poté, co nevyhověla jeho požadavkům týkajícím se používání umělé inteligence (AI). Prezident Donald Trump krátce před tím uvedl, že nařídil federálním úřadům postupně ukončit využívání jejích AI technologií. Spor mezi firmou vyvíjející chatbot Claude a

    … více »
    Ladislav Hagara | Komentářů: 18
    28.2. 15:44 | Upozornění

    Zemřel Rob Grant, spolutvůrce kultovního sci-fi seriálu Červený trpaslík.

    Ladislav Hagara | Komentářů: 8
    Které desktopové prostředí na Linuxu používáte?
     (17%)
     (7%)
     (0%)
     (12%)
     (27%)
     (2%)
     (5%)
     (2%)
     (13%)
     (26%)
    Celkem 1000 hlasů
     Komentářů: 25, poslední 3.2. 19:50
    Rozcestník

    Obskurní konstrukce v C++

    29.11.2017 18:27 | Přečteno: 2525× | C++ | poslední úprava: 2.12.2019 18:09

    Následující konstrukce jsou v C++ validní a asi nikoho nepřekvapí.
    while (int a = getData()) {
    
    	// kód
    
    }
    
    for (int a = getData(); a; a = getData()) {
    
    	// kód
    
    }
    
    Nicméně tohle už v C++ validní není:
    do (int a = getData()) {
    
    	// kód
    
    } while ((a = getData()));
    
    Takže nás to nutí psát ošklivé konstrukce jako třeba:
    {
    	int a = getData();
    	do {
    
    		// kód
    
    	} while ((a = getData()));
    }
    
    Smyslem je pracovat uvnitř cyklu s hodnotou proměnné a, ale podmínku testovat až na jeho konci. Přitom ale chceme mít rozsah platnosti proměnné omezen na daný cyklus. Že by po podobné konstrukci C++ byla poptávka, můžeme soudit podle dotazů zde a zde.

    Řešením může být tato obskurní knihovna. A následný kód je najednou validní.
    do (int a = getData()) {
    
        // kód
    
    } while ((a = getData()));
    
    Důležité je, že tato knihovna neporuší původní syntaxi klíčového slova do v cyklu do-while.

    Ještě dodám, že ty dvojité závorky jsou tam záměrně. Jinak by GCC vypsalo varování:

    warning: suggest parentheses around assignment used as truth value [-Wparentheses]
    

    Pokud se vám takové konstrukce líbí, tak z tohohle a tohohle budete nadšeni.        

    Hodnocení: 67 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    29.11.2017 22:42 Dadam | skóre: 12 | blog: dadamovo
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Jaké je sdělení blogu? Že v C++ se dá psát jak prase?
    A i B mají svoje výhody a nevýhody. Vyberte si to, co vám vyhovuje víc, a necpěte A tam, kam patří B.
    29.11.2017 23:03 VM
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Nevím co koho k čemu nutí, já bych to napsal buď jako
    do {
    ...
    } while( getData() );
    
    případně, pokud bych chtěl ten výsledek, tak
    int a;
    do {
    ...
    } while(( a=getData() ));
    
    30.11.2017 12:26 prqek | blog: prqek
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Přesně tohle mě napadlo. A když chci omezit platnost a, tak to celé zabalím do {}. Sice nad tím může taky kdekdo kroutit hlavou, ale pořád lepší než ta podivnost se switchem, kterou jsem snad ještě nikdy neviděl.
    30.11.2017 12:27 prqek | blog: prqek
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Tak koukám, že tam tahle varianta vlastně je.
    30.11.2017 12:33 finn | skóre: 43 | blog: finnlandia | 49° 44´/13° 22´
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Tahle konstrukce nebude dělat co má, protože ani v jednom případě se s návratovou hodnotou nedá pracovat uvnitř cyklu (což jsem pochopil, že je cíl) a co hůř, ve druhém případě uvnitř cyklu bude proměnná a definovaná, ale během první iterace nebude mít definovanou hodnotu!
    Užívej dne – možná je tvůj poslední.
    DaBler avatar 1.12.2017 01:14 DaBler | skóre: 17 | blog: dabler | Brno
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Přesně tak. Uvedl jsem to raději přímo do textu.
    30.11.2017 02:34 Petr
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Moje oblíbená je
    a=a;
    která nejen že není syntaktickou chybou, ale pokud si implementujete vlastní rovnítko, tak s ní musíte počítat. Na druhou stranu tomuto výrazu můžete přiradit nějaký speciální význam.
    30.11.2017 10:40 Kojot
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Nicméně tohle už v C++ validní není:
    do {
    
    	// kód
    
    } while (int a = getData());
    
    A k čemu je tato konstrukce dobrá? Proměnná "a" vznikne až v podmínce u while na konci bloku, takže se nemůže použít uvnitř, a zanikne při opuštění cyklu.
    30.11.2017 12:43 stepan
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    +1 Autor asi nema paru, jak takovy vyraz funguje...

    while (int a = getData()) {

    // kód

    }

    Je moc uzitecna konstrukce, obdobne jako:

    if (int a = getData()) { ... }

    A za tohle bych programatora zabil:

    switch (int a = getData()) do default: {

    // kód

    } while ((a = getData()));

    Blog prispevek naprosto onicem. C++ ma milion dalsich vlastnosti, ktere by si zaslouzili hate, ale tohle zrovna ne.
    DaBler avatar 1.12.2017 01:21 DaBler | skóre: 17 | blog: dabler | Brno
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Nevznikne, protože tento kód se nepřeloží.
    1.12.2017 09:53 Kojot
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Už to vidím. Místo abyste se chytil za nos, tak jste dodatečně upravil svůj text:
    Nicméně tohle už v C++ validní není:
    do (int a = getData()) {
    
    	// kód
    
    } while ((a = getData()));
    Jen pro info. Toto se také nepřeloží :D.
    DaBler avatar 1.12.2017 10:01 DaBler | skóre: 17 | blog: dabler | Brno
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Vždyť to nad tím máte napsané.
    1.12.2017 10:19 Kojot
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Já tam nevidím zmínku o tom, že došlo přepsání původního textu, a tudíž že moje reakce je na původní text.
    30.11.2017 13:32 Semo | skóre: 45 | blog: Semo
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    3. varianta ma nijak neuraza. Na rozdiel od 4.
    If you hold a Unix shell up to your ear, you can you hear the C.
    30.11.2017 16:15 MadCatX
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Obskurní konstrukce? To by se to taky mohlo napsat takto:
    #include <iostream>
    #include <functional>
    
    int glob = 10;
    
    template <typename TData>
    void do_loop(const std::function<TData ()> &getter, const std::function<void (TData&)> &worker)
    {
    	TData data = getter();
    	do {
    		worker(data);
    	} while ((data = getter()));
    }
    
    int main()
    {
    	int i = 65;
    
    	do_loop<int>([&]() { return glob--;}, [&](int &d){ std::cout << i + d << "\n"; });
    
    	return 0;
    }
    
    Jinak ten zápis s dvojím voláním getData() mi přijde úplně normální...
    30.11.2017 16:19 MadCatX
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Obskurní konstrukce? To by se to taky mohlo napsat takto: Jinak ten zápis s dvojím voláním getData() mi přijde úplně normální...
    Myslím tu třetí možnost s do-while zabaleným scopu.
    DaBler avatar 1.12.2017 01:12 DaBler | skóre: 17 | blog: dabler | Brno
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Pěkný kód ;-)
    1.12.2017 11:18 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Obávám se, že v C++ se dají napsat mnohem obskurnější konstrukce...
    1.12.2017 11:25 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Osobně mám poslední dobou s C++ problém mít přehled o všech možných kategoriích hodnot - lvalue a rvalue jsem zvládal, C++11 move semantics víceméně taky (ačkoli mi trochu chybí ta jednoduchost/přímočarost move semantics z Rustu), ale těch kategorií tam je už dost, a navíc mají některé jiný význam v C++11 a jiný v C++17... :-/
    3.12.2017 12:59 stepan
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    C++ bude zachvili tak komplexni, ze i ani autori jazyka ho nebudou znat cele.. (rekl bych ze uz ani neznaji). No radeji bych hral ruskou ruletu, nez psal parsovaci gramatiku pro C++. Bohuzel zatim neexistuje nic lepsiho (nechci rozjizdet flame, ale na veci co delam ja, tak C++ je stale superior), mozna casem D nebo Rust, ale tyhle jazyky jsou nejak firmami ignorovany.
    3.12.2017 18:33 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Tak to celkem souhlas. Jsem sice fanoušek (a občasný přispěvatel) Rustu, ale nedělám si iluze, že by byl v nějaký suprový pozici. C++ i přes své vady zůstává standardem.
    Josef Kufner avatar 3.12.2017 20:11 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    C++ už tak kompexní dávno je.
    Hello world ! Segmentation fault (core dumped)
    3.12.2017 22:27 Odin
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    1. Chyba neni v pouzitem jazyku, ale v nedostatecne kvalite objektoveho navrhu. Jiste i vas mozek pri zvazeni dostupnych moznosti jazyka prijde na validni cestu.

    2. Mozna jednoduse na psani v tomto jazyce nemate. Neni to vase chyba. Ocividne c++ nerozumite. Mozna jste jen junior pracujici za par tisic, ktery ma sanci se jeste veci doucit. Kazopadne se radeji verejne neztrapnujte a bezte delat neco smysluplneho. Treba vas zamestna ten clovek, co zde kdysi psal o fastfoodu.
    DaBler avatar 3.12.2017 22:48 DaBler | skóre: 17 | blog: dabler | Brno
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    Odine, možná nerozumíte významu slova obskurní. Zkuste použít slovník :)
    6.12.2017 22:00 .
    Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
    To je na facku, vole.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.