Portál AbcLinuxu, 30. dubna 2025 16:48

Obskurní konstrukce v C++

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

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

29.11.2017 22:42 Dadam | skóre: 12 | blog: dadamovo
Rozbalit Rozbalit vše Re: Obskurní konstrukce v C++
Odpovědět | Sbalit | Link | Blokovat | Admin
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++
Odpovědět | Sbalit | Link | Blokovat | Admin
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++
Odpovědět | Sbalit | Link | Blokovat | Admin
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++
Odpovědět | Sbalit | Link | Blokovat | Admin
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++
Odpovědět | Sbalit | Link | Blokovat | Admin
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++
Odpovědět | Sbalit | Link | Blokovat | Admin
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++
Odpovědět | Sbalit | Link | Blokovat | Admin
Obávám se, že v C++ se dají napsat mnohem obskurnější konstrukce...
SPD vůbec není proruská
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++
Odpovědět | Sbalit | Link | Blokovat | Admin
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++
Odpovědět | Sbalit | Link | Blokovat | Admin
To je na facku, vole.

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.