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 14:33 | Nová verze

Byla vydána nová verze 1.30 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
dnes 14:22 | Nová verze

Deset dnů po představení beta verze byla vydána stabilní verze Steam Linku pro Raspberry Pi umožňující streamovat hry ve službě Steam z počítače na televizní obrazovku.

Ladislav Hagara | Komentářů: 1
včera 20:00 | Nová verze

Byla vydána (YouTube) verze 2018.3 multiplatformního herního enginu Unity (Wikipedie). Přehled novinek i s videoukázkami v příspěvku na blogu a v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
včera 19:33 | Nová verze

Byla vydána verze 18.12.0 KDE Aplikací (KDE Applications). Přehled novinek v kompletním seznamu změn a na stránce s dalšími informacemi. Správce souborů Dolphin umí nově například zobrazovat náhledy dokumentů vytvořených v LibreOffice a aplikací ve formátu AppImage. Konsole plně podporuje obrázkové znaky emoji. V Okularu lze k pdf souborům přidávat poznámky.

Ladislav Hagara | Komentářů: 3
včera 17:11 | Nová verze

Byla vydána nová stabilní verze 2.2 (2.2.1388.34) webového prohlížeče Vivaldi (Wikipedie). Z novinek vývojáři zdůrazňují například vylepšení správy listů - vybrané listy lze uložit jako relaci, možnost zobrazení klávesových zkratek určených webovou stránkou nebo možnost přehrávání videí v režimu obrazu v obraze. Nejnovější Vivaldi je postaveno na Chromiu 71.0.3578.85.

Ladislav Hagara | Komentářů: 6
včera 14:22 | Nová verze

Po 4 měsících vývoje od vydání verze 3.0.0 byla vydána nová verze 3.1.0 otevřeného emulátoru procesorů a virtualizačního nástroje QEMU (Wikipedie). Přispělo 189 vývojářů. Provedeno bylo více než 1 900 commitů. Přehled úprav a nových vlastností v seznamu změn.

Ladislav Hagara | Komentářů: 0
včera 01:32 | Nová verze

Letos bylo v komunitě Mageia hodně změn. Po volbě nových vedoucích přišla velká aktualizace a krátce na to udržovací verze 6.1. 7.12., dle plánu, vyšla Mageia s číslem 7 v její první beta verzi. Chyby můžete hlásit v bugzille. Chyby v českých překladech pak na fóru české komunity.

Joelp | Komentářů: 1
včera 00:11 | Zajímavý projekt

Kvůli rychlejšímu vývojovému cyklu byla přemístěna Cinelerra-gg. Cinelerra-gg je fork Cinelerry-hv. Některé rozdíly forků popisuje sám hlavní vývojář William Morrow (aka GoodGuy). Není zde popsán i fork Lumiera, zřejmě kvůli zatím nepoužitelnému stavu.

… více »
D81 | Komentářů: 0
12.12. 19:11 | Nová verze

Do aplikace pro instant messaging Telegram (Wikipedie) lze nově nahrát češtinu. Více v příspěvku na blogu Telegramu.

Ladislav Hagara | Komentářů: 7
12.12. 10:55 | Nová verze

Jean-Baptiste Kempf, prezident neziskové organizace VideoLAN stojící za svobodným multiplatformním multimediálním přehrávačem a frameworkem VLC, oznámil v příspěvku na svém blogu vydání první oficiální verze 0.1.0 v říjnu představeného dekodéru svobodného videoformátu AV1 (AOMedia Video 1) s názvem dav1d (Dav1d is an AV1 Decoder). Jedná se o alternativu k referenčnímu dekodéru libaom. Kódový název dav1da verze 0.1.0 je Gazelle.

Ladislav Hagara | Komentářů: 3
Chystáte se přejít na Wayland na „desktopu“?
 (25%)
 (6%)
 (12%)
 (31%)
 (26%)
Celkem 124 hlasů
 Komentářů: 18, poslední dnes 10:05
Rozcestník

Obskurní konstrukce v C++

29.11.2017 18:27 | Přečteno: 2167× | C++ | poslední úprava: 3.12.2017 01:28

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 následující obskurní konstrukce.
switch (int a = getData()) do default: {

    // kód

} while ((a = getData()));
Případně ji můžeme trochu obfuskovat pomocí:
#define do(while) switch (while)do default:
A následný kód je najednou validní.
do (int a = getData()) {

    // kód

} while ((a = getData()));
Důležité je, že tento #define 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: 42 | 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: 13 | 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: 13 | 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: 13 | 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: 44 | 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: 13 | blog: dabler | Brno
Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
Pěkný kód ;-)
1.12.2017 11:18 oryctolagus | 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 oryctolagus | 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 oryctolagus | 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: 68
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: 13 | 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.