Existuje rozdíl mezi použitím pro (;;) a while (1)?


Odpověď 1:

Pokud jde o vygenerovaný kód, měl by vám jakýkoli moderní kompilátor C poskytnout stejné výsledky.

Autoři, profesoři a další, kteří říkají, že pro (;;) vytváří více režijních nákladů buď (a) nevědí, o čem mluví, nebo (b) pracují se starými nebo rozbitými kompilátory. for (;;) negeneruje žádné další režijní náklady, protože neexistuje žádná podmínka a žádné krokování smyčkové proměnné. Pokud něco, zatímco (1) ve starodávném neoptimalizačním kompilátoru by ve skutečnosti mohlo produkovat více režijních nákladů, protože bezbožně kontroluje, zda 1 je nenulová v horní části každé iterace. Moderní kompilátoři to nedělají.

V některých implementacích kompilátoru, pokud jste dostatečně zahnuli varovné úrovně nebo použili pomocný program podobný chuchvělu, můžete dostat varování na chvíli (1) nebo jeho ekvivalent, který říká, že něco jako podmíněný výraz je konstantní. for (;;) negeneruje žádné takové varování, protože neexistuje podmíněný výraz. Pracoval jsem na projektech, kde jsme chtěli kompilovat s nulovými varováními, a proto jsem se rozhodl použít pro (;;) místo ekvivalentu chvíli (1). Také pro (;;) může být snazší vyhledávání než u variant while.

Mimochodem, pokud budete chtít používat chvíli, považuje se za lepší číst:

while (true)

než říct:

zatímco (1)

přestože první z nich vyžaduje více psaní.

V moderním jazyce C (tj. Již od roku C99 v roce 1999) byste neměli vytvářet vlastní verzi TRUE. Místo toho vložte soubor záhlaví stdbool.h a budete mít přístup k definovanému datovému typu bool (namísto použití klíčového slova _Bool) a symbolů true a false. Vrácení vlastních pravdivých / nepravdivých hodnot je tak…

… 1998.


Odpověď 2:

Standard: Standard C ++

6.5.3 Pro příkaz1 Pro příkaz pro (pro-init-příkaz kondicionát; expresní) příkaz je ekvivalentní [kódu] {pro-init-příkaz, zatímco (podmínka) {výraz výrazu; }} [/ code] kromě toho, že jména deklarovaná v příkazu for-init-jsou ve stejné deklarativní oblasti jako jména deklarovaná ve stavu a kromě toho, že pokračování v příkazu (není uzavřeno v jiném iteračním příkazu) provede výraz před opětovným spuštěním -hodnotící stav. [Poznámka: První příkaz tedy určuje inicializaci smyčky; podmínka (6.4) specifikuje test, provedený před každou iterací, takže smyčka je opuštěna, když se podmínka stane nepravdivou; výraz často určuje přírůstek, který se provádí po každé iteraci .— koncová poznámka] 2 Buď je možné vynechat buď podmínku i výraz. Chybějící podmínka způsobí, že implicitní klauzule je ekvivalentní době (true).

Možná


Odpověď 3:

Každý kompilátor, který stojí za svou sůl, by v obou případech vygeneroval identický kód.

Jednou z možných preferencí pro možnost (;;) je to, že někteří (mnoho?) Lidé považují za „špatný styl“ používat číselné konstanty v kódu. To znamená, že nepíšete

x + = 10;

ale píšeš

static const int my_constant_value = 10;

(...)

x + = my_constant_value;

Důvod je ten, že mít všechny číselné konstanty výslovně deklarované (a raději na začátku zdrojového souboru, spíše než šířit po celém souboru) vede k udržovatelnějšímu kódu.

Zjevně to nijak neliší, pokud jde o (;;) vs while (1), ale vidět '1' v kódu bez čísel je stále nepříjemné.

V C ++ (a protože C99, také v C) můžeme psát "while (true)", ale to je ještě delší než "while (1)", což samo o sobě je delší (o 1 znak) než "for (;;) ".