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 16:11 | Komunita

Vývojáři relačního databázového systému PostgreSQL oznámili, že schválili svůj Code of Conduct (CoC) aneb kodex chování vývojářů PostgreSQL.

Ladislav Hagara | Komentářů: 2
dnes 14:44 | Nová verze

Byla vydána verze 1.0 poštovního serveru Courier (Wikipedie). Aktualizovány byly také související balíčky jako Courier authentication library, Courier-IMAP, SqWebMail, maildrop nebo Cone.

Ladislav Hagara | Komentářů: 0
dnes 02:22 | Zajímavý software

Společnost ​Versity Software otevřela svůj archivační souborový systém ScoutFS. Zdrojové kódy jsou k dispozici na GitHubu (kernel space, user space) pod licencí GPLv2.

Ladislav Hagara | Komentářů: 18
dnes 00:44 | Nová verze

Byla vydána verze 4.2 programovacího jazyka Swift (Wikipedie). Zdrojové kódy jsou k dispozici na GitHubu. Ke stažení jsou oficiální binární balíčky pro Ubuntu 18.04, Ubuntu 16.04 a Ubuntu 14.04. Přehled novinek ve videozáznamu přednášky z WWDC 2018.

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

Po třech a půl letech od vydání verze 3.4.1 byla vydána nová verze 3.4.2 programu pro filtrování spamu Apache SpamAssassin (Wikipedie). Z novinek lze zmínit 4 nové pluginy. Pravidla budou ověřována pomocí SHA-256 a SHA-512 místo SHA-1. Řešeny jsou také 4 bezpečnostní chyby. Například chyba CVE-2018-11780 v pluginu PDFInfo zneužitelná ke vzdálenému spuštění kódů (RCE).

Ladislav Hagara | Komentářů: 0
včera 16:22 | Pozvánky

Díky openSUSE Video Teamu lze sledovat živý přenos většiny prezentací z letošní SUSE Labs Conference. Záznamy proběhlých prezentací budou postupně přidávány na kanál SUSE Labs na YouTube.

Michal Kubeček | Komentářů: 0
včera 10:22 | Pozvánky

Na webových stránkách konference LinuxDays byl zveřejněn program přednášek a workshopů. Současně byla spuštěna registrace. Konference proběhne o víkendu 6. a 7. října 2018 v Praze v areálu ČVUT v Dejvicích na Fakultě informačních technologií.

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

Linus Torvalds se v oznámení o vydání 4. rc verze Linuxu 4.19 omlouvá za své chování. Posledním commitem před zvýšením rc3 na rc4 bylo odstranění souboru s Code of Conflict a přidání souboru s Contributor Covenant Code of Conduct vycházejícího z Contributor Covenant. Vývoj Linuxu 4.19 dokončí Greg Kroah-Hartman. Linus Torvalds si bere volno a bude pracovat na svém chování. Pravděpodobně vylepší svého poštovního klienta, aby mu nedovolil odesílat emaily obsahující nadávky.

Ladislav Hagara | Komentářů: 40
16.9. 11:33 | Nová verze

Byla vydána verze 1.23 open source nástroje pro on-the-fly šifrování (OTFE) dat VeraCrypt. Přehled novinek v nejnovější verzi tohoto nástupce TrueCryptu v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
15.9. 11:11 | Nová verze

Byly vydány verze 3.0.3 a 3.16 softwaru Wine (Wikipedie), tj. softwaru vytvářejícího aplikační rozhraní umožňující chod aplikací pro Microsoft Windows také pod GNU/Linuxem. Stabilní verze 3.0.3 je třetí opravnou verzí verze 3.0 vydané v lednu. Opravuje 52 chyb. Z novinek vývojové verze 3.16 lze zmínit například počáteční implementaci OPC Services (Open Packaging Conventions).

Ladislav Hagara | Komentářů: 1
Na optické médium (CD, DVD, BD aj.) jsem naposledy vypaloval(a) data před méně než
 (13%)
 (15%)
 (21%)
 (23%)
 (24%)
 (3%)
 (1%)
Celkem 351 hlasů
 Komentářů: 33, poslední 16.9. 11:55
Rozcestník

Obskurní konstrukce v C++

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