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

    Společnost Raspberry Pi dnes vstoupila na Londýnskou burzu jako Raspberry Pi Holdings plc (investor).

    Ladislav Hagara | Komentářů: 0
    dnes 01:22 | IT novinky

    Do 17. června do 19:00 běží na Steamu přehlídka nadcházejících her Festival Steam Next | červen 2024 doplněná demoverzemi, přenosy a dalšími aktivitami. Demoverze lze hrát zdarma.

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

    Apple na své vývojářské konferenci WWDC24 (Worldwide Developers Conference, keynote) představil řadu novinek: svou umělou inteligenci pojmenovanou jednoduše Apple Intelligence, iOS 18, visionOS 2, macOS Sequoia, iPadOS 18, watchOS 11, …

    Ladislav Hagara | Komentářů: 3
    včera 21:44 | Nová verze

    Vyšla nová verze XMPP (Jabber) klienta Gajim, která přidává podporu reakcí pomocí emoji (XEP-0444: Message Reactions) a citace zpráv (XEP-0461: Message Replies). Přehled dalších vylepšení je k dispozici na oficiálních stránkách.

    sonicpp | Komentářů: 0
    včera 15:00 | Nová verze

    Po po téměř roce vývoje od vydání verze 5.38 byla vydána nová stabilní verze 5.40 programovacího jazyka Perl (Wikipedie). Do vývoje se zapojilo 75 vývojářů. Změněno bylo přibližně 160 tisíc řádků v 1 500 souborech. Přehled novinek a změn v podrobném seznamu.

    Ladislav Hagara | Komentářů: 7
    včera 12:00 | Zajímavý článek

    Uroš Popović popisuje, jak si nastavit Linux na desce jako Raspberry Pi Zero, aby je šlo používat jako USB „flešku“.

    Fluttershy, yay! | Komentářů: 1
    včera 08:44 | Zajímavý software

    Andreas Kling oznámil, že jelikož už se nevěnuje nezávislému operačnímu systému SerenityOS, ale výhradně jeho webovému prohlížeči Ladybird, přičemž vyvíjí primárně na Linuxu, SerenityOS opustí a Ladybird bude nově samostatný projekt (nový web, repozitář na GitHubu).

    Fluttershy, yay! | Komentářů: 2
    včera 02:22 | Nová verze

    Po dvou měsících vývoje byla vydána nová verze 0.13.0 programovacího jazyka Zig (GitHub, Wikipedie). Přispělo 73 vývojářů. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    8.6. 17:55 | Komunita

    Na čem aktuálně pracují vývojáři GNOME a KDE? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE.

    Ladislav Hagara | Komentářů: 11
    7.6. 14:55 | IT novinky

    Před 70 lety, 7. června 1954, ve věku 41 let, zemřel Alan Turing, britský matematik, logik, kryptoanalytik a zakladatel moderní informatiky.

    Ladislav Hagara | Komentářů: 28
    Rozcestník

    Obskurní konstrukce v C++

    29.11.2017 18:27 | Přečteno: 2401× | 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.