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í
×
    včera 18:11 | Nová verze

    Programovací jazyk Python byl vydán v nové major verzi 3.14.0. Podrobný přehled novinek v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 2
    včera 16:33 | IT novinky

    Bylo oznámeno, že Qualcomm kupuje Arduino. Současně byla představena nová deska Arduino UNO Q se dvěma čipy: MPU Qualcomm Dragonwing QRB2210, na kterém může běžet Linux, a MCU STM32U585 a vývojové prostředí Arduino App Lab.

    Ladislav Hagara | Komentářů: 1
    včera 15:55 | Nová verze

    Multiplatformní open source voxelový herní engine Luanti byl vydán ve verzi 5.14.0. Podrobný přehled novinek v changelogu. Původně se jedná o Minecraftem inspirovaný Minetest v říjnu loňského roku přejmenovaný na Luanti.

    Ladislav Hagara | Komentářů: 0
    včera 13:22 | Nová verze

    Byla vydána nová stabilní verze 6.10 (YouTube) multiplatformního frameworku a GUI toolkitu Qt. Podrobný přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    6.10. 23:55 | Komunita

    Ubuntu 26.04 LTS bude (𝕏) Resolute Raccoon (rezolutní mýval).

    Ladislav Hagara | Komentářů: 3
    6.10. 21:00 | Nová verze

    Netwide Assembler (NASM) byl vydán v nové major verzi 3.00. Přehled novinek v poznámkách k vydání v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 0
    6.10. 20:11 | Komunita

    Linuxová distribuce Frugalware (Wikipedie) ke konci roku 2025 oficiálně končí.

    Ladislav Hagara | Komentářů: 0
    6.10. 17:22 | Nová verze

    Byla vydána nová verze 3.0.6 svobodné aplikace pro úpravu a vytváření rastrové grafiky GIMP (GNU Image Manipulation Program). Přehled novinek v oznámení o vydání a v souboru NEWS na GitLabu. Nový GIMP bude brzy k dispozici také na Flathubu.

    Ladislav Hagara | Komentářů: 0
    6.10. 16:11 | IT novinky

    Americký výrobce čipů AMD uzavřel s americkou společností OpenAI smlouvu na několikaleté dodávky vyspělých mikročipů pro umělou inteligenci (AI). Součástí dohody je i předkupní právo OpenAI na přibližně desetiprocentní podíl v AMD.

    Ladislav Hagara | Komentářů: 1
    6.10. 12:22 | Nová verze Ladislav Hagara | Komentářů: 0
    Jaké řešení používáte k vývoji / práci?
     (39%)
     (46%)
     (15%)
     (17%)
     (21%)
     (15%)
     (18%)
     (16%)
     (16%)
    Celkem 190 hlasů
     Komentářů: 12, poslední 4.10. 20:35
    Rozcestník

    Obskurní konstrukce v C++

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